简体   繁体   English

如何使用Alamofire 4在Swift 3中为JSON数据发送带有参数和正文的POST请求?

[英]How to send POST request with both parameter and body for JSON data in Swift 3 using Alamofire 4?

Postman api url added below. Postman api url在下面添加。 在此输入图像描述

Present code : 现有代码:

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)
        }}

I don't know how to add body request through this code. 我不知道如何通过此代码添加正文请求。 Please help me to slove this problem. 请帮我解决这个问题。

You are mixing two things here, page , size and sortBy is you need to pass with the url string as query string. 你在这里混合两件事, pagesizesortBy你需要传递url字符串作为查询字符串。 Now your body is request is JSON Array and you can post array with Alamofire only using URLRequest . 现在你的身体是请求是JSON数组,你只能使用URLRequest发布Alamofire数组。 So try like this. 所以试试这样吧。

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
}

Try this: Using Custom Encoding 试试这个:使用自定义编码

 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
    }
}

Calling 调用

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
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM