2015-08-13 66 views
44

我試圖使用Alamofire快速發送身體發送請求。如何在SWIFT中發送POST請求與身體

的json的身體看起來像:

{ 
    "IdQuiz" : 102, 
    "IdUser" : "iosclient", 
    "User" : "iosclient", 
    "List":[ 
     { 
     "IdQuestion" : 5, 
     "IdProposition": 2, 
     "Time" : 32 
     }, 
     { 
     "IdQuestion" : 4, 
     "IdProposition": 3, 
     "Time" : 9 
     } 
    ] 
} 

我試圖讓letlist與NSDictionnary看起來像:

[[Time: 30, IdQuestion: 6510, idProposition: 10], [Time: 30, IdQuestion: 8284, idProposition: 10]] 

,並使用Alamofire我的要求是這樣的:

Alamofire.request(.POST, "http://myserver.com", parameters: ["IdQuiz":"102","IdUser":"iOSclient","User":"iOSClient","List":list ], encoding: .JSON) 
      .response { request, response, data, error in 
      let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding) 
       println(dataString) 
     } 

該請求有錯誤,我相信問題是與詞典列表,因爲如果我提出的請求沒有列表它工作正常,所以任何想法?


我試圖解決建議,但我面臨同樣的問題:

let json = ["List":list,"IdQuiz":"102","IdUser":"iOSclient","UserInformation":"iOSClient"] 
     let data = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted,error:nil) 
     let jsons = NSString(data: data!, encoding: NSUTF8StringEncoding) 



    Alamofire.request(.POST, "http://myserver.com", parameters: [:], encoding: .Custom({ 
     (convertible, params) in 
     var mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest 
     mutableRequest.HTTPBody = jsons!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
     return (mutableRequest, nil) 
    })) 
     .response { request, response, data, error in 
     let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding) 
      println(dataString) 
    } 
+3

可能重複://計算器。com/questions/27855319/post-request-with-a-simple-string-in-body-with-alamofire) –

+1

感謝您的評論,但是提供的帖子無濟於事,我也沒有試圖通過一個字符串作爲身體,所以你可以請仔細閱讀帖子 –

+0

@YasserB。將你的JSON轉換爲NSString(有這種方法),然後使用@Bhavin的鏈接? – Larme

回答

55

你靠近。參數字典格式不正確。您應該嘗試以下操作:

let parameters: [String: AnyObject] = [ 
    "IdQuiz" : 102, 
    "IdUser" : "iosclient", 
    "User" : "iosclient", 
    "List": [ 
     [ 
      "IdQuestion" : 5, 
      "IdProposition": 2, 
      "Time" : 32 
     ], 
     [ 
      "IdQuestion" : 4, 
      "IdProposition": 3, 
      "Time" : 9 
     ] 
    ] 
] 

Alamofire.request(.POST, "http://myserver.com", parameters: parameters, encoding: .JSON) 
    .responseJSON { request, response, JSON, error in 
     print(response) 
     print(JSON) 
     print(error) 
    } 

希望能解決您的問題。如果沒有,請回復,我會相應地調整我的答案。

+0

如何設置一些屬性我的JSON爲null,因爲我不能將'nil'分配給'AnyObject'? –

+0

我在通話錯誤中收到額外的參數 –

+2

@JaseemAbbas檢查您的Alamofire版本,如果您使用的是v4.0 +請查看我的答案 –

1

我想通知的變化很少。您可以從現在開始訪問請求,JSON,來自響應對象的錯誤。

 let urlstring = "Add URL String here" 
     let parameters: [String: AnyObject] = [ 
      "IdQuiz" : 102, 
      "IdUser" : "iosclient", 
      "User" : "iosclient", 
      "List": [ 
       [ 
        "IdQuestion" : 5, 
        "IdProposition": 2, 
        "Time" : 32 
       ], 
       [ 
        "IdQuestion" : 4, 
        "IdProposition": 3, 
        "Time" : 9 
       ] 
      ] 
     ] 

     Alamofire.request(.POST, urlstring, parameters: parameters, encoding: .JSON).responseJSON { response in 
      print(response.request) // original URL request 
      print(response.response) // URL response 
      print(response.data)  // server data 
      print(response.result) // result of response serialization 

      if let JSON = response.result.value { 
       print("JSON: \(JSON)") 
      } 
      response.result.error 
     } 
84

如果您使用的斯威夫特3 Alamofire V4.0然後接受的答案是這樣的:

let parameters: [String: Any] = [ 
    "IdQuiz" : 102, 
    "IdUser" : "iosclient", 
    "User" : "iosclient", 
    "List": [ 
     [ 
      "IdQuestion" : 5, 
      "IdProposition": 2, 
      "Time" : 32 
     ], 
     [ 
      "IdQuestion" : 4, 
      "IdProposition": 3, 
      "Time" : 9 
     ] 
    ] 
] 

Alamofire.request("http://myserver.com", method: .post, parameters: parameters, encoding: JSONEncoding.default) 
    .responseJSON { response in 
     print(response) 
    } 
+3

好極了!請將接受的答案改爲這個! :)或結合當前的Alamofire 3和4解決方案。 –

+0

同意 - 這是'JSONEncoding'的明確說明,以消除它爲我做的類型。 –

+0

@Gianni Carlo我用同樣的答案,但在我的成功反應,我收到錯誤。 – Ramakrishna

3

的Xcode 8.X,斯威夫特3.X

易使用;

let params:NSMutableDictionary? = [ 
    "IdQuiz" : 102, 
    "IdUser" : "iosclient", 
    "User" : "iosclient", 
    "List": [ 
     [ 
      "IdQuestion" : 5, 
      "IdProposition": 2, 
      "Time" : 32 
     ], 
     [ 
      "IdQuestion" : 4, 
      "IdProposition": 3, 
      "Time" : 9 
     ] 
    ] 
]; 
      let ulr = NSURL(string:"http://myserver.com" as String) 
      let request = NSMutableURLRequest(url: ulr! as URL) 
      request.httpMethod = "POST" 
      request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
      let data = try! JSONSerialization.data(withJSONObject: params!, options: JSONSerialization.WritingOptions.prettyPrinted) 

      let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
      if let json = json { 
       print(json) 
      } 
      request.httpBody = json!.data(using: String.Encoding.utf8.rawValue); 


      Alamofire.request(request as! URLRequestConvertible) 
       .responseJSON { response in 
        // do whatever you want here 
        print(response.request) 
        print(response.response) 
        print(response.data) 
        print(response.result) 

      } 
9

我不喜歡任何其他的答案到目前爲止(也許除了one通過SwiftDeveloper),因爲他們要麼要求你反序列化JSON,只爲它再次被序列化,或關心JSON本身的結構。

正確的answer已被afrodev發佈在另一個問題。你應該去爭取它。

下面只是我的適應,有一些小的變化(主要是明確的UTF-8字符集)。

let urlString = "https://example.org/some/api" 
let json = "{\"What\":\"Ever\"}" 

let url = URL(string: urlString)! 
let jsonData = json.data(using: .utf8, allowLossyConversion: false)! 

var request = URLRequest(url: url) 
request.httpMethod = HTTPMethod.post.rawValue 
request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type") 
request.httpBody = jsonData 

Alamofire.request(request).responseJSON { 
    (response) in 

    print(response) 
} 
+0

謝謝你的信用人! – afrodev

+0

我同意@ SwiftDeveloper的答案比你提到的'正確'答案更好,並且(對我來說)更完整。但我會爭論兩點。其一,你提到的'正確答案'有一個'toJSONString'不是本地方法的缺陷,所以它基本上是一個你必須實現的黑盒子。第二,你給出的答案提供了一個var json字符串,它始於一個json字符串,實際上沒有人擁有這樣的參數,除非你以這種方式在本地轉換和存儲它們。 –

+0

@GianniCarlo 1)在我的答案中沒有'toJSONString',2)「現實中沒有人有這樣的參數」 - 這是做了很多假設; JSON可能來自應用程序的不同部分,與完成請求無關,而且網絡代碼無法識別。 –

1

我已經稍微編輯了SwiftDeveloper的回答,因爲它不適合我。我也添加了Alamofire驗證。

let body: NSMutableDictionary? = [ 
    "name": "\(nameLabel.text!)", 
    "phone": "\(phoneLabel.text!))"] 

let url = NSURL(string: "http://server.com" as String) 
var request = URLRequest(url: url! as URL) 
request.httpMethod = "POST" 
request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
let data = try! JSONSerialization.data(withJSONObject: body!, options: JSONSerialization.WritingOptions.prettyPrinted) 

let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
if let json = json { 
    print(json) 
} 
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue) 
let alamoRequest = Alamofire.request(request as URLRequestConvertible) 
alamoRequest.validate(statusCode: 200..<300) 
alamoRequest.responseString { response in 

    switch response.result { 
     case .success: 
      ... 
     case .failure(let error): 
      ... 
    } 
} 
-1

{(HTTP [POST在主體上的簡單的字符串與Alamofire請求]的

if Reachability.isConnectedToNetwork() == true 
    { 

     let hud = MBProgressHUD.showAdded(to: self.view, animated: true) 
     hud.mode = .indeterminate 
     hud.label.text = "Loading" 
     hud.animationType = .fade 

     var request = URLRequest(url: URL(string: "http://skandal24.serv.si/ws/webservice/forgot_password")!) 
     request.httpMethod = "POST" 

     let postString = String(format: "email=%@&lang=%@", arguments: [txt_emailVirify.text!, language!]) 
     print(postString) 

     emailString = txt_emailVirify.text! 
     request.httpBody = postString.data(using: .utf8) 
     request.addValue("delta141forceSEAL8PARA9MARCOSBRAHMOS", forHTTPHeaderField: "Authorization") 
     request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 



     Alamofire.request(request).responseJSON { response in 
      //Your code 
      print(response.value) 

      if response.response?.statusCode == 200 
      { 
       let dictionary = (response.value) as! AnyObject 
       let status = dictionary.value(forKey: "status") as! String 
       let sts = Int(status) 
       DispatchQueue.main.async() 
        { 
         if sts == 200 
         { 


         } 
        } 

      } 
      else 
      { 


      } 


     } 


    } 


    else 
    { 

    } 



}