当我在Xcode控制台中看到它时,奇怪的是,URL参数的输出与我使用Alamofire输入的不一样,
请参阅以下原始代码:
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的输出:
键: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}
这两个问题导致错误:
错误域= NSCocoaErrorDomain代码= 3840"无法完成操作。 (可可误差3840。)" (字符0周围的值无效。)
因此,我无法从API获取数据。但是,当从上面的两个问题手动纠正URL时,意味着URL:
- 在常量" params",
中将参数序列更改为相同- 并删除额外的" 25"。
醇>
然后它可以工作,我可以在网络浏览器中看到来自API的响应数据。
那么,请问,我在代码中忽略了哪些问题?
谢谢!
答案 0 :(得分:1)
您说您在控制台上看到以下内容:
key:2v7eK8AlzynX%2BuLBgw7DU74f8S0%3D
您没有向我们展示如何生成此key
值,但这很奇怪,因为该字符串是转义百分比,而不应该是。如果删除百分比转义符,则会看到类似
key:2v7eK8AlzynX+uLBgw7DU74f8S0=
这是一个结构良好的base64字符串。
问题是,如果你正在使用Alamofire,你不应该逃避它(Alamofire会为你做到这一点)。事实上,这就是为什么你会看到额外的“25”,因为它是第二次逃离你的密钥字符串的百分比,用%
替换%25
个字符。
从底线,找出key
已被百分比转义的原因,并防止这种情况发生。 (或者,在将{%1}}添加到字典之前删除百分比转义;但最好是防止转义百分比而不是添加然后替换百分比转义。)如果您将stringByReplacingPercentEscapesUsingEncoding
值传递给它在2v7eK8AlzynX+uLBgw7DU74f8S0=
字典中,一切都应该没问题。
关于parameters
集合:parameters
是一个字典,与数组不同,字典不是有序集合,它们不会保留指定键的顺序。幸运的是,标准Web服务器中的HTTP请求中的参数也不是特定于订单的,因此这不是问题。