ios - Swift HTTP Post 请求返回网站的 HTML,而不是 JSON 响应

标签 ios swift http post urlsession

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

最佳答案

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

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

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

关于ios - Swift HTTP Post 请求返回网站的 HTML,而不是 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49513731/

相关文章:

swift - 我应该如何解决此错误 : Thread 1: EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=650 MB, 未使用 = 0x0)?

ios - 更新 UITableViewCell

php - 为什么有时 php 返回像纯文本 HTTP/1.1 200 OK 这样的 http header ,而它应该只返回 json?

c++ - 处理C++在iOS中导致崩溃

android - 更改视频聊天帧率 tokbox

ios - 直到隐藏键盘,按钮才按下

ios - 如何使用 UIWebView 消除内存泄漏?

ios - 找不到 -lGTMSessionFetcher 的库

swift - 按下按钮后,打开邮件并让用户将电子邮件发送到指定地址?

http - Google Analytics 4 测量协议(protocol)不起作用