SWIFT HTTP POST请求返回网站的HTML而不是JSON响应



我正在尝试到达一个应该获取给定的用户名和密码的站点,并返回一个JSON,其中包含信息,说明所提供的登录数据是否有效。但是,我要回来的只是网站的HTML代码而不是响应。我已经在https://www.hurl.it/上尝试了使用相同参数的请求,并且已经获得了正确的响应,因此似乎不是问题。

我使用以下代码:

private func uploadToAPI(username: String, password: String) {
guard let url = URL(string: "http://api.foo.com/login.php"),
  let encodedUsername = username.addingPercentEncoding(withAllowedCharacters: CharacterSet.alphanumerics),
  let encodedPassword = password.addingPercentEncoding(withAllowedCharacters: CharacterSet.alphanumerics) else {
  self.loginButton.isLoading = false
  return
}
let httpBodyParameters = ["user": encodedUsername, "password": encodedPassword, "client": "ios", "version": "5"]
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = try? JSONSerialization.data(withJSONObject: httpBodyParameters, options: JSONSerialization.WritingOptions.prettyPrinted)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
URLSession.shared.dataTask(with: request) { (data, response, error) in
  if let response = response {
    print(response.mimeType) // Prints "text/html"
  }
  if let data = data {
    print(try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments)) // Prints nil
    print(String(data: data, encoding: String.Encoding.utf8)) // Prints the site's HTML
  }
}.resume()
 }

我看不到问题在哪里。我还尝试过不设置HTTP标头,但这没有区别。有人有任何想法吗?

似乎没有设置HTTP标头字段,而是使用字符串字面而不是字典,因为HTTP Body Data为我做到了。

对于任何感兴趣的人,这是现在收到预期响应的代码:

  guard let url = URL(string: "http://api.foo.com/login.php?"),
      let encodedUsername = username.addingPercentEncoding(withAllowedCharacters: CharacterSet.alphanumerics),
      let encodedPassword = password.addingPercentEncoding(withAllowedCharacters: CharacterSet.alphanumerics) else {
        if let delegate = self.delegate {
          delegate.viewModelDidRejectLogin(self)
        }
        return
    }
    let httpBodyString = "user=(encodedUsername)&password=(encodedPassword)&client=ios&version=5"
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = httpBodyString.data(using: String.Encoding.utf8)
    URLSession.shared.dataTask(with: request) { (data, response, error) in
      guard let data = data, error == nil else {
        print(error)
        return
      }
      do {
        if let json = try JSONSerialization.jsonObject(with: data) as? [String : AnyObject] {
          self.readLoginResponse(json)
        }
      } catch {
        print(error)
      }
    }.resume()

相关内容

  • 没有找到相关文章

最新更新