如何在Alamofire中使用(+加号)发布参数

时间:2018-02-07 09:37:21

标签: swift alamofire

当发布A+O+或任何(+)血型具有+字符时,我收到“无效血液”错误。

blood值在JSON词典中:如何在Alamofire中发布+个字符?

let dictionary = ["fname": "name",
                  "lname": "family",
                  "blood": "A+"]

let updateData = try! JSONEncoder().encode(dictionary)
let jsonString = String(data: updateData, encoding: .utf8)!

var components = URLComponents(string: registerUrl)!
components.queryItems = [
    URLQueryItem(name: "api_key", value: apiKey),
    URLQueryItem(name: "profile", value: jsonString)
]

Alamofire.request(components.url!, method: .post).responseJSON {
    response in
    if response.result.isSuccess {
        let json: JSON = JSON(response.result.value!)
        print(json)
    }
}

1 个答案:

答案 0 :(得分:1)

不幸的是,URLComponents不会对+字符进行百分比编码,尽管许多(大多数?)网络服务都要求它(因为,根据x-www-form-urlencoded规范,它们会替换{{1}空格字符)。当我发布关于此的错误报告时,Apple的回答是这是设计的,并且应该手动对+字符进行百分比编码:

+

显然,如果您正在执行标准var components = URLComponents(string: "https://www.wolframalpha.com/input/")! components.queryItems = [ URLQueryItem(name: "i", value: "1+2") ] components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B") 请求,并且请求正文中包含JSON,则不需要此类百分比编码。但是如果您要在这样的URL中包含JSON,那么您必须自己对application/json字符进行百分比编码。

或者,你可以让Alamofire为你做这件事:

+

这无疑将正确的百分比编码值放在let parameters = [ "api_key": apiKey, "profile": jsonString ] Alamofire.request(url, method: .post, parameters: parameters).responseJSON { response in ... } 请求的正文中,而不是示例中的URL,但通常在POST请求中,这就是我们想要的。