如何避免 Alamofire 自动更改参数?
how to avoid Alamofire change parameters automatically?
奇怪的是我在Xcode控制台看到URL参数的输出和我用Alamofire输入的不一样,
- 参数的顺序已更改
- 和额外的数字 "25" 添加到参数 "key"、
请看以下原码:
let weatherURL="http://open.weather.com.cn/data/"
let params=["areaid":"\(areaid)","type":"forecast_v","date":"\(time)","appid":"1eb583","key":"\(URLEncodeKey)"]
Alamofire.request(.GET, weatherURL, parameters: params)
.responseJSON { (request, response, json, error) in
if((error) != nil){
println(request)
println("Error:\(error)")
}else{
println(request)
println(json)
}
}
控制台中 URL 的输出:
key:2v7eK8AlzynX%2BuLBgw7DU74f8S0%3D
NSMutableURLRequest: 0x7fe3f14a1bf0 { URL: http://open.weather.com.cn/data/?appid=1eb583&areaid=101020900&date=201507211626&key=2v7eK8AlzynX%252BuLBgw7DU74f8S0%253D&type=forecast_v }
这两个问题导致的错误:
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.)
因此我无法从 API 获取数据。但是当 URL 由上面的两个问题手动更正时,意味着 URL:
- change the parameters sequence as the same in constant "params",
- and remove extra "25".
然后它工作了,我可以在网络浏览器中看到来自 API 的响应数据。
所以,拜托,我在代码中忽略了哪些问题?
谢谢!
您说您在控制台上看到以下内容:
key:2v7eK8AlzynX%2BuLBgw7DU74f8S0%3D
您没有向我们展示这个 key
值是如何生成的,但这很奇怪,因为该字符串是百分比转义的,而它不应该是。如果您删除逃逸百分比,您会看到类似
的内容
key:2v7eK8AlzynX+uLBgw7DU74f8S0=
这是一个格式正确的 base64 字符串。
问题是,如果您使用的是 Alamofire,您不应该逃避它(Alamofire 会为您做到这一点)。事实上,这就是为什么您会看到额外的“25”,因为它是第二次转义您的密钥字符串的百分比,将 %
字符替换为 %25
。
最重要的是,找出为什么 key
已经逃逸百分比,并防止这种情况发生。 (或者,在将其添加到字典之前使用 stringByReplacingPercentEscapesUsingEncoding
删除百分比转义;但是最好防止百分比转义而不是添加然后替换百分比转义。)如果将 2v7eK8AlzynX+uLBgw7DU74f8S0=
值传递给它在 parameters
字典中,一切都应该没问题。
关于 parameters
集合:parameters
是一个字典,与数组不同,字典不是有序集合,它们不会保留您指定键的顺序。幸运的是,标准 Web 服务器中的 HTTP 请求中的参数也不是特定于顺序的,因此这不是问题。
奇怪的是我在Xcode控制台看到URL参数的输出和我用Alamofire输入的不一样,
- 参数的顺序已更改
- 和额外的数字 "25" 添加到参数 "key"、
请看以下原码:
let weatherURL="http://open.weather.com.cn/data/"
let params=["areaid":"\(areaid)","type":"forecast_v","date":"\(time)","appid":"1eb583","key":"\(URLEncodeKey)"]
Alamofire.request(.GET, weatherURL, parameters: params)
.responseJSON { (request, response, json, error) in
if((error) != nil){
println(request)
println("Error:\(error)")
}else{
println(request)
println(json)
}
}
控制台中 URL 的输出:
key:2v7eK8AlzynX%2BuLBgw7DU74f8S0%3D
NSMutableURLRequest: 0x7fe3f14a1bf0 { URL: http://open.weather.com.cn/data/?appid=1eb583&areaid=101020900&date=201507211626&key=2v7eK8AlzynX%252BuLBgw7DU74f8S0%253D&type=forecast_v }
这两个问题导致的错误:
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.)
因此我无法从 API 获取数据。但是当 URL 由上面的两个问题手动更正时,意味着 URL:
- change the parameters sequence as the same in constant "params",
- and remove extra "25".
然后它工作了,我可以在网络浏览器中看到来自 API 的响应数据。
所以,拜托,我在代码中忽略了哪些问题?
谢谢!
您说您在控制台上看到以下内容:
key:2v7eK8AlzynX%2BuLBgw7DU74f8S0%3D
您没有向我们展示这个 key
值是如何生成的,但这很奇怪,因为该字符串是百分比转义的,而它不应该是。如果您删除逃逸百分比,您会看到类似
key:2v7eK8AlzynX+uLBgw7DU74f8S0=
这是一个格式正确的 base64 字符串。
问题是,如果您使用的是 Alamofire,您不应该逃避它(Alamofire 会为您做到这一点)。事实上,这就是为什么您会看到额外的“25”,因为它是第二次转义您的密钥字符串的百分比,将 %
字符替换为 %25
。
最重要的是,找出为什么 key
已经逃逸百分比,并防止这种情况发生。 (或者,在将其添加到字典之前使用 stringByReplacingPercentEscapesUsingEncoding
删除百分比转义;但是最好防止百分比转义而不是添加然后替换百分比转义。)如果将 2v7eK8AlzynX+uLBgw7DU74f8S0=
值传递给它在 parameters
字典中,一切都应该没问题。
关于 parameters
集合:parameters
是一个字典,与数组不同,字典不是有序集合,它们不会保留您指定键的顺序。幸运的是,标准 Web 服务器中的 HTTP 请求中的参数也不是特定于顺序的,因此这不是问题。