【问题标题】:NSURLRequest giving the correct result on iphone 5s and newer but failing on iphone 4s and 5NSURLRequest 在 iphone 5s 和更新版本上给出正确的结果,但在 iphone 4s 和 5 上失败
【发布时间】:2016-04-10 08:54:33
【问题描述】:

我已经为这个问题苦苦挣扎了几天,但仍然没有找到解决方案。基本上,我使用 Alamofire 进行 POST NSURLRequest 并在请求正文中将用户和密码作为 json 发送,以便我可以在响应中接收会话令牌:

let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: path)!)
mutableURLRequest.HTTPMethod = "POST"
mutableURLRequest.setValue("application/json", forHTTPHeaderField:"Content-Type")
switch self {
case AuthenticateApp:
  let parameters = [
    "method": "login",
    "params": [
      "user": user,
      "password": pass
    ]
  ]
mutableURLRequest.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: [])
case ...

我的问题是该请求仅在 iphone 5s 及更高版本上成功,而在 iphone 4s 或 5 上运行相同请求时出现错误:

{
  "error" : "Login or password was invalid.",
  "code" : 1
}

我已尝试打印和检查多个内容,但没有找到任何可以指出问题根源的内容。我尝试了NSHTTPURLResponse different on iPhone 5 vs 5s 中给出的解决方案,并将以下代码添加到请求中,但没有帮助:

mutableURLRequest.setValue("gzip", forHTTPHeaderField:"Content-Encoding")

我打印了 iphone 5 和 5s 的响应标头字段,没有发现任何差异。好像服务器没有收到正确格式的用户名和密码?用户名包含“@”符号。这可能是造成问题的原因吗?

更新:

Apple 开发者论坛的一位好心人为我指明了正确的方向 - 来自 32 位设备的请求由于某种原因被服务器拒绝了。我现在不知道如何解决这个问题......

【问题讨论】:

  • 可能是您的密码和用户不同。可能是服务器注意到密码/用户已被使用。
  • 用户名/密码每次都相同。我不是以用户身份登录,而是以管理员身份授权应用程序。

标签: ios iphone swift httprequest alamofire


【解决方案1】:

我终于设法解决了这个问题。事实证明,请求正文在解析为 json 时,在 64 位上看起来像这样:

{
  "method": "login",
  "params": {
    "user": "user",
    "password": "password"
  }
}

在 32 位上它看起来像这样:

{
  "params": {
    "password": "password",
    "user": "user"
  },
  "method": "login"
}

是的,服务器,出于未知原因,要求以特定顺序列出参数,否则它将失败。再次感谢您的帮助。

【讨论】:

  • parameters 是一个字典。字典是无序的集合:无论平台是什么,都没有可预测的顺序。
  • 然而,出于某种原因,我连接的后端 api 将生成的 json 文件视为数组。
猜你喜欢
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
相关资源
最近更新 更多