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

时间:2015-07-21 13:12:02

标签: ios swift get alamofire

当我在Xcode控制台中看到它时,奇怪的是,URL参数的输出与我使用Alamofire输入的不一样,

  1. 参数'序列改变了
  2. 并将额外数字" 25" 添加到参数" key",
  3. 请参阅以下原始代码:

        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:

      

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

         
        
    1. 在常量" params",
    2. 中将参数序列更改为相同   
    3. 并删除额外的" 25"。
    4.   

    然后它可以工作,我可以在网络浏览器中看到来自API的响应数据。

    那么,请问,我在代码中忽略了哪些问题?

    谢谢!

1 个答案:

答案 0 :(得分:1)

您说您在控制台上看到以下内容:

key:2v7eK8AlzynX%2BuLBgw7DU74f8S0%3D

您没有向我们展示如何生成此key值,但这很奇怪,因为该字符串是转义百分比,而不应该是。如果删除百分比转义符,则会看到类似

的内容
key:2v7eK8AlzynX+uLBgw7DU74f8S0=

这是一个结构良好的base64字符串。

问题是,如果你正在使用Alamofire,你不应该逃避它(Alamofire会为你做到这一点)。事实上,这就是为什么你会看到额外的“25”,因为它是第二次逃离你的密钥字符串的百分比,用%替换%25个字符。

从底线,找出key已被百分比转义的原因,并防止这种情况发生。 (或者,在将{%1}}添加到字典之前删除百分比转义;但最好是防止转义百分比而不是添加然后替换百分比转义。)如果您将stringByReplacingPercentEscapesUsingEncoding值传递给它在2v7eK8AlzynX+uLBgw7DU74f8S0=字典中,一切都应该没问题。

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