2015-08-13 57 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 
    { 

    } 



}