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

标签 ios swift get alamofire

奇怪的是,当我在 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”,因为它是第二次转义您的 key 字符串的百分比,替换了 %。带有 %25 的字符.

最后,找出为什么 key已经逃脱了百分比,并防止这种情况发生。 (或者,在将其添加到字典之前,用 stringByReplacingPercentEscapesUsingEncoding 删除逃逸百分比;但是最好防止逃逸百分比而不是添加然后替换逃逸百分比。)如果将 2v7eK8AlzynX+uLBgw7DU74f8S0= 传递给它parameters 中的值字典,一切都应该没问题。


关于 parameters收藏:本parameters是字典,与数组不同,字典不是有序集合,它们不会保留您指定键的顺序。幸运的是,标准 Web 服务器中 HTTP 请求中的参数也不是特定于顺序的,因此这不是问题。

关于ios - 如何避免 Alamofire 自动更改参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31540037/

相关文章:

ios - 在不结束回合的情况下更新 GKTurnBasedMatch 中的 matchData

iphone - 在 Html 中嵌入图像并在 UIWebView 中加载

swift - Controller 纳米格。 TagSelectController 或 TagSelectionController

php - 当 $_GET 是我唯一的选择时发送用户名 + 密码的最安全方式

c# - 如何使用 C# 获取 HTML <textarea> 值?

c# - c#中的Get和Set方法到底是如何使用和实现的

iphone - 在 UIActivityIndi​​catorView 中需要帮助 - iPhone

ios - 在 iOS 7 中维护导航动画

swift - “pod spec lint”在项目转换为 Swift 4 后失败

ios - 我可以在 iOS 8 中使用重构的 Storyboard吗?