【问题标题】:NSMutableUrlRequest not sending proper parameters for HTTP requestNSMutableUrlRequest 没有为 HTTP 请求发送正确的参数
【发布时间】:2015-10-01 21:28:52
【问题描述】:

我正在尝试发送 POST 请求,以便用户可以登录到此应用程序。但是,当我尝试发送信息时,服务器返回一条错误消息,指出它没有收到登录信息。我之前使用过这个完全相同的代码,但 URL 使用的是 HTTPS 而不是 HTTP。 swift 2 是否有不同的方法来处理 HTTP 请求?

在我的 info.plist 文件中,我添加了以下内容:

<key>NSAppTransportSecurity</key>  
 <dict>  
      <key>NSAllowsArbitraryLoads</key><true/>  
 </dict> 

api 调用在除 iOS 之外的所有设备上都可以正常工作,并且代码可以在不同的 url 上正常工作。如果 Swift 2 不再接受 HTTP 请求,是否有解决方法?

static let URL = "http://url.com:3000"

static let netSession = NSURLSession.sharedSession() // A shared NSURLSession that will be used to make API calls

// Call to login with the provided credentials. If login is successful the handler function will
// receive 'true', otherwise 'false'.

static func login(email : String, password : String, handler : (success: Bool, error: APIError?) -> ()) {

    let request = NSMutableURLRequest(URL: NSURL(string: "\(URL)/users/login")!)

    request.HTTPMethod = "POST"

    let params = ["email":email,"password":password]
    request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: [])

    netSession.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
        if error != nil {
            handler(success: false, error: APIErrorNetwork)
            return
        }

        let jsonResponse = JSON(data: data!)
        let httpResponse = response as! NSHTTPURLResponse

        if httpResponse.statusCode == 200 {
            // Handle the expected response
        } else {
            handler(success: false, error: APIError(json: jsonResponse))
            print(httpResponse.statusCode);
        }
    }).resume()
}

【问题讨论】:

  • 执行请求时输出控制台中打印的内容是什么?您可以添加该信息以及状态代码吗?
  • 状态码 = 401。错误消息是 req.body 上需要的“电子邮件”和“密码”。所以我假设参数从未发送过
  • 尝试使用一些桌面 REST 客户端应用程序测试 Web 服务,例如 CocoaRestClient。这样,您将检查 Web 服务是否正常工作。如果是,则错误在您的代码中。此外,在将 HTTPBody 设置为请求后测试它是否不为零。
  • 我测试了 Web 服务,它工作正常。 HTTPBody 不是零。可选值:Optional()
  • 使用Charles Proxy查看确切的网络http/https流量。

标签: ios httprequest swift2 xcode7 nsmutableurlrequest


【解决方案1】:

您确定您的服务器接受JSON 吗?它是否希望您改为发布表单数据?

如果它确实需要JSON,请尝试在您的请求中添加Content-Type 标头:

    request.setValue("application/json", forHTTPHeaderField: "Accept");

有些服务器很挑剔。

【讨论】:

  • 添加授权标头有效。我没有意识到这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-07-06
  • 2016-07-03
  • 2018-05-14
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多