2017-06-29 78 views
2

Postman API添加到下面。 enter image description here如何使用Alamofire 4在Swift 3中使用参数和正文发送POST请求以获取JSON数据?

本次代码:

let baseUrl = "abc.com/search/" 
let param = [ 
     "page":"1", 
     "size":"5", 
     "sortBy":"profile_locality" 
    ] 

    let headers = [ 
     "Content-Type": "application/json" 
    ] 


    Alamofire.SessionManager.default.request("\(baseUrl)field", method: .post,parameters: param, encoding: JSONEncoding.default, headers: headers).responseJSON { response in 
     print(response.request ?? "no request") // original URL request 
     if(response.response?.statusCode != nil){ 
      print("done") 
      if self.checkResponse(response.response!.statusCode){ 
       let json = JSON(data: response.data!) 
       //print("at_LeadStop json \(json)") 
       return completionHandler(json, false) 

      } else { 
       return completionHandler(JSON.null, true) 
      } 
     } else { 
      print("gone") 
      return completionHandler(JSON.null, true) 
     }} 

我不知道如何通过这个代码添加身体的要求。请帮我解决这个问题。

+0

你不通过''中的参数parameters' param' –

+0

https://开头计算器.com/questions/42696851/get-request-with-parameters来构造URL?和[{fieldName}]参数中的内容 – Larme

+0

感谢@NiravD发表评论。我有传递参数的参数。 –

回答

4

你在这里混合两件事,pagesizesortBy你需要传递url字符串作为查询字符串。现在你的身体请求是JSON数组,你可以使用URLRequest来发布数组Alamofire。所以试试这个。

let baseUrl = "abc.com/search/" 
let queryStringParam = [ 
    "page":"1", 
    "size":"5", 
    "sortBy":"profile_locality" 
] 
//Make first url from this queryStringParam using URLComponents 
var urlComponent = URLComponents(string: baseUrl)! 
let queryItems = queryStringParam.map { URLQueryItem(name: $0.key, value: $0.value) } 
urlComponent.queryItems = queryItems 

//Now make `URLRequest` and set body and headers with it 
let param = [ 
    [ 
     "fieldName" : "abc", 
     "fieldValue":"xyz" 
    ], 
    [ 
     "fieldName" : "123", 
     "fieldValue":"789" 
    ] 
] 
let headers = [ "Content-Type": "application/json" ] 
var request = URLRequest(url: urlComponent.url!) 
request.httpMethod = "POST" 
request.httpBody = try? JSONSerialization.data(withJSONObject: param) 
request.allHTTPHeaderFields = headers 

//Now use this URLRequest with Alamofire to make request 
Alamofire.request(request).responseJSON { response in 
    //Your code 
} 
+0

感谢您的帮助@Nirav D –

+0

@KushalShrestha欢迎队友:) –

+0

谢谢Nirav ...花了半天后发现这:) :) – Ameer

0

试试这个:使用自定义编码

struct JSONStringArrayEncoding: ParameterEncoding { 
    private let array: [[String : Any]] 

    init(array: [[String : Any]]) { 
     self.array = array 
    } 

    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { 
     var urlRequest = try urlRequest.asURLRequest() 

     let data = try JSONSerialization.data(withJSONObject: array, options: []) 

     if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { 
      urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 
     } 

     urlRequest.httpBody = data 

     return urlRequest 
    } 
} 

调用

let values = [ 
      [ 
       "fieldName" : "abc", 
       "fieldValue":"xyz" 
      ], 
      [ 
       "fieldName" : "123", 
       "fieldValue":"789" 
      ] 
     ] 

     let param = [ 
      "page":"1", 
      "size":"5", 
      "sortBy":"profile_locality" 
     ] 

     let parameterEncoding = JSONStringArrayEncoding.init(array: values) 

     Alamofire.request("url", method: .post, parameters: param, encoding:parameterEncoding ).validate().response { (responseObject) in 
      // do your work 
     } 
+0

谢谢为你的帮助@KKRocks –

相关问题