2016-09-04 31 views
1

我有下面的代碼,我試圖發送一個API請求。IOS Swift發佈請求從身份驗證和數據形式

當我通過bash運行下面的代碼時,我得到了一個創建的響應。但是,當我試圖將其轉換爲swift並運行代碼時,API會拒絕我的代碼。

有什麼想法?

HTTP -a邁克:密碼POST http://mybudget-env.hnfarjj5iy.ap-southeast-2.elasticbeanstalk.com/api/transactions/量= 1000 USER =麥克描述= test1的

HTTP/1.1 201 Created 
Allow: GET, POST, HEAD, OPTIONS 
Connection: keep-alive 
Content-Type: application/json 
Date: Sun, 04 Sep 2016 10:45:39 GMT 
Server: Apache/2.4.23 (Amazon) mod_wsgi/3.5 Python/2.7.10 
Vary: Accept,Cookie 
X-Frame-Options: SAMEORIGIN 
transfer-encoding: chunked 

{ 
    "amount": "1000", 
    "created": "2016-09-04T10:45:39.432369Z", 
    "description": "test1", 
    "id": 18, 
    "owner": 2 
} 

我viewcontroller.swift

import UIKit 

class PostController: UIViewController { 

    @IBOutlet weak var firstname: UITextField! 
    @IBOutlet weak var lastname: UITextField! 
    @IBOutlet weak var instrument: UITextField! 
    @IBOutlet weak var test: UITextField! 

    @IBAction func buttonPost(sender: UIButton) { 
     print(postForm("amount=" + self.firstname.text! + " user=" + self.lastname.text! + " description=" + self.instrument.text!)) 


    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     firstname.autocorrectionType = .No 
     lastname.autocorrectionType = .No 
     instrument.autocorrectionType = .No 
     test.autocorrectionType = .No 


     //Looks for single or multiple taps. 
     let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(PostController.dismissKeyboard)) 
     view.addGestureRecognizer(tap) 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func postForm(postString: String) -> String { 

     let url:NSURL = NSURL(string: "http://mybudget-env.hnfarjj5iy.ap-southeast-2.elasticbeanstalk.com/api/transactions/")! 
     let session = NSURLSession.sharedSession() 

     let username = "mike" 
     let password = "password" 
     let loginString = NSString(format: "%@:%@", username, password) 
     let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! 
     let base64LoginString = loginData.base64EncodedStringWithOptions([]) 

     let request = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "POST" 
     request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization") 
     request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

     let paramString = postString 
     request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding) 

     let task = session.dataTaskWithRequest(request) { 
      (
      let data, let response, let error) in 

      guard let _:NSData = data, let _:NSURLResponse = response where error == nil else { 
       print("error") 
       return 
      } 

      let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print(dataString) 

     } 

     task.resume() 




     let greeting = postString 
     return greeting 
    } 


    func dismissKeyboard() { 
     //Causes the view (or one of its embedded text fields) to resign the first responder status. 
     view.endEditing(true) 
    } 



    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 

回答

2

您沒有設置您所查詢的內容類型並且您沒有在每個參數之間添加&

您應該像查爾斯一樣使用代理工具來檢查每種情況下設備實際上是否會留在網絡中,以便糾正所有不匹配。

+0

感謝您的意見。這聽起來像是一個好主意,可以很好地瞭解POST請求的一些可見性。我將添加&符號,我將如何添加內容類型?在此先感謝 – Jimmyn

+0

內容類型是一個標題,說明什麼類型的http正文數據,在你的情況下,它的形式是URL編碼 – Wain