当发布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)
}
}
答案 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
请求中,这就是我们想要的。