【问题标题】:Translating Alamofire call to URLSession将 Alamofire 调用转换为 URLSession
【发布时间】:2016-11-05 13:05:08
【问题描述】:

我有一个旧代码库,我正试图从中迁移出来。网络调用当前使用 Alamofire 4.0,我正在尝试使用 URLSession 代替。我很难弄清楚出了什么问题,这就是我一直在做的事情。我从要发布的路线和参数开始:

// route to user creation
let url = ...

let params = ["user": ["first_name": "John", "last_name": "Appleseed", "email": "john@apple.com", "password": "asdfgh"]]

这是新旧网络调用:

// old network request
Alamofire.request(url, method: .post, parameters: newUser, encoding: JSONEncoding.default).responseJSON { response in
  // ...
}

// new code
var request = URLRequest(url: url)
let jsonData = try! JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
request.httpBody = jsonData
request.httpMethod = "POST"
let task = URLSession.shared.dataTask(with: request) { data, response, error in
  guard let data = data, error == nil else { return print("error=\(error)") }

  if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
    print("status code should be 200, but is \(httpStatus.statusCode)")
    print("response = \(response)")
  }

  let responseString = String(data: data, encoding: .utf8)
  print("responseString = \(responseString)")
}

task.resume()

由于某种原因,我在URLSession 尝试中得到状态码 400。 Alamofire 工作正常。

任何建议表示赞赏。

【问题讨论】:

  • @EricAya 忘记在问题中写了。更新。不过我已经把它写在我的项目代码中了。
  • 那我看不出有什么问题。除了可能之外,尝试像这样声明参数的类型:let params: [String: Any] = 它可能会有所帮助。
  • 也可以尝试用[]替换.prettyPrinted,有些服务器不喜欢在httpBody中有漂亮的JSON。
  • .prettyPrinted 替换为[],但没有骰子:(
  • [String: Any] 也不起作用?那我就不知道了。我希望其他人能够帮助你。祝你好运! :)

标签: swift httprequest alamofire


【解决方案1】:

问题是请求未被识别为 JSON 调用。在创建 URLRequest 后编写以下作业:

request.allHTTPHeaderFields = ["Content-Type": "application/json"]

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多