如何避免 Alamofire 自动更改参数?

how to avoid Alamofire change parameters automatically?

奇怪的是我在Xcode控制台看到URL参数的输出和我用Alamofire输入的不一样,

  1. 参数的顺序已更改
  2. 和额外的数字 "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:

http://open.weather.com.cn/data/?areaid=101020900&type=forecast_v&date=201507211626&appid=1eb583&key=2v7eK8AlzynX%2BuLBgw7DU74f8S0%3D

  1. change the parameters sequence as the same in constant "params",
  2. 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 请求中的参数也不是特定于顺序的,因此这不是问题。