在HTTP POST请求中传递多个参数

时间:2015-10-26 13:57:10

标签: swift nsurlconnection swift2 nsurlrequest alamofire

我是初学者,我真的被卡住了。我想通过向提到的URL发送POST请求来上传产品,其中包含自动生成的客户端ID和作为参数发送的产品JSON。此外,我还要求此请求中的cookie。我发现使用Alamofire非常难以实现,因此同样欢迎NSURLConnection解决方案。请帮忙。提前谢谢!

HTTP POST Request URL: http://blahblah.com/api/v1/products/saveDraft

HTTP Request Headers:
version: 0.1.7
Cookie: client=iOS; version=0.1.7; sellerId=SEL5483318784; key=178a0506-0639-4659-9495-67e5dffa42de
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 1431

HTTP URL parameters: clientId=1444657827384-344b7992-8608-49b1-976a-f405defa189&[PRODUCTJSON]

我试图执行的Alamofire请求如下。请求失败,错误请求错误(状态代码400)

    let cookies = "client=iOS; version=" + version + "; sellerId=" + sellerId + "; key=" + sellerKey


    let manager = Manager.sharedInstance
    manager.session.configuration.HTTPAdditionalHeaders = [
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Cookie": cookies
    ]

    Alamofire.request(.POST, ServerConfig.ADD_PRODUCT_URL, parameters: productJSON, encoding: .JSON, headers: nil)
        .responseJSON(completionHandler: { responseRequest, responseResponse, responseResult in
            print(responseRequest!.URL)
            print(responseResponse)
            print(responseResult)
       })

请注意,Product Json不包含客户端ID。我仍然需要找到一种方法将它们作为参数包含在HTTP POST请求中。

2 个答案:

答案 0 :(得分:0)

这就是我发布帖子请求的方式:

let request = NSMutableURLRequest(URL: NSURL(string: "http://blahblah.com/api/v1/products/saveDraft")!)
request.HTTPMethod = "POST"
var postString: String?
postString = "client=iOS; version=" + version + "; sellerId=" + sellerId + "; key=" + sellerKey
request.HTTPBody = postString!.dataUsingEncoding(NSUTF8StringEncoding)
 let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data, response, error in

            if error != nil {
                print("error=\(error)")
                print("ERROR")
            }

//DO something

答案 1 :(得分:0)

@ godlike的答案很好,但是你需要用&符号分隔postString参数而不是分号:

postString = "client=iOS&version=" + version + "&sellerId=" + sellerId + "&key=" + sellerKey

这对我有用。

此外,根据输入的来源,您可能需要考虑对变量进行编码以转义特殊字符。如果它们来自用户的输入,您可以执行以下操作:

let encodedUserMessage = userMessage.addingPercentEncoding(withAllowedCharacters: .alphanumerics)

我会对@ godlike的回答发表评论,但我没有足够的声誉。希望这可以帮助其他人,因为我花了很多时间试图找出如何传递多个参数。