【问题标题】:how to avoid Alamofire change parameters automatically?如何避免 Alamofire 自动更改参数?
【发布时间】:2015-07-21 13:12:01
【问题描述】:

奇怪的是在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 "无法完成操作。(Cocoa 错误 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. 并删除多余的“25”。

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

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

谢谢!

【问题讨论】:

    标签: ios swift get alamofire


    【解决方案1】:

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

    key:2v7eK8AlzynX%2BuLBgw7DU74f8S0%3D
    

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

    key:2v7eK8AlzynX+uLBgw7DU74f8S0=
    

    这是一个格式良好的 base64 字符串。

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

    底线,找出key 已经被转义百分比的原因,并防止这种情况发生。 (或者,在将其添加到字典之前使用stringByReplacingPercentEscapesUsingEncoding 删除百分比转义;但最好防止百分比转义而不是添加然后替换百分比转义。)如果您将2v7eK8AlzynX+uLBgw7DU74f8S0= 值传递给@987654330 @dictionary,一切都会好起来的。


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

    【讨论】:

    • 非常感谢,罗布。删除 stringByReplacingPercentEscapesUsingEncoding 后,“键”打印为应有的内容。但是你知道为什么“let params”的顺序被改变了吗?例如,“areaid”是“let params”中的第一个参数,但随后成为控制台中的第二个参数。该 URL 仅在我将序列调整为 API 请求时才有效。
    • @steve 正如我在修订后的答案中所述,字典不是排序集合,这就是顺序更改的原因。你说你的API只有在你调整顺序时才有效?!?这是非常非常不寻常的。你100%确定吗?标准 Web 服务器不关心参数出现的顺序。我唯一一次听说这很重要是连接到一些没有适当的 Web 服务器但具有类似 HTTP 接口的笨拙的集成电路设备时。但是编写良好的 Web 服务器并不关心参数的顺序。
    • 是的,我多次尝试更改参数进行测试,只能使用API​​中请求的固定序列并成功返回json数据。我的后退步骤是将参数直接传递到 URL 并从 Alamofire 中删除“参数”。像这样, 'let weatherURL="open.weather.com.cn/data/…)"' 'Alamofire.request(.GET, weatherURL)' 这是一个官方的国家天气 API,我使用它的原因是因为我认为它应该是准确的并且
    • 我之所以使用它是因为我认为它应该是准确和准时的,但实际上它又丑又愚蠢。我认为我应该更改为其他第三个 API 服务器。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多