Swift HTTP Post 请求 returns HTML 站点而不是 JSON 响应

Swift HTTP Post Request returns HTML of site instead of JSON response

我正在尝试访问一个网站,该网站应使用给定的用户名和密码,并且 return 一个 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 headers 但这没有区别。有人有什么想法吗?

似乎没有设置 HTTP header 字段并使用字符串文字而不是字典,因为 HTTP body 数据为我做了这件事。

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

  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()