在swift中发出POST请求时的状态代码400

时间:2015-08-10 20:25:12

标签: swift nsurlsession http-status-code-400

我一直收到这个错误,我不知道如何解决! 我正在尝试从Web API解析访问令牌,为此我设置了post请求。 不知何故,它在'responseString'行上抛出一个错误。

import UIKit
import Foundation

class ViewController: UIViewController, NSURLConnectionDelegate {

    @IBOutlet var userName: UITextField!
    @IBOutlet var password: UITextField!

    @IBAction func submit(sender: AnyObject) {

        let postString = "username=" + userName.text + "&password=" + password.text + "&grant_type=password";
        let data: NSData = postString.dataUsingEncoding(NSUTF8StringEncoding)!
        let base64LoginString = data.base64EncodedStringWithOptions(nil)
        let postLength=NSString(format: "%ld", data.length)

        let url = NSURL(string: "http://www.myurl.com/Token")
        let request = NSMutableURLRequest(URL: url!);
        request.HTTPMethod = "POST"
        request.HTTPBody = data
        request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.addValue(base64LoginString, forHTTPHeaderField: "Authorization")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")

        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {data, response, error in

            if error != nil {
            println("error = \(error)")
            return

            }
        //print out response object
            println("******* response = \(response)")

        //print out response body // THIS LINE THROWS STATUS CODE 400 ERROR
            let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("******* response data = \(responseString)")

            var err: NSError?
            var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err) as? NSDictionary

            if let parseJSON = json {
                var token = parseJSON["access_token"] as? String
                println("token: \(token)")

            }

        }


        task.resume()

    }

这是错误

******* response = <NSHTTPURLResponse: 0x7ff1eb4496d0> { URL: https://www.myurl.com/Token } { status code: 400, headers {
    "Cache-Control" = "no-cache";
    "Content-Length" = 34;
    "Content-Type" = "application/json;charset=UTF-8";
    Date = "Mon, 10 Aug 2015 20:16:14 GMT";
    Expires = "-1";
    Pragma = "no-cache";
    "X-Powered-By" = "ASP.NET";
} }

3 个答案:

答案 0 :(得分:0)

您的错误似乎是基本身份验证格式的错误使用。它应该是这样的:

  

授权:基本QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

其中

  

QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

是base64中的用户名:密码

所以在你的情况下就是这样:

    let postString = userName.text + ":" + password.text ;
    let data: NSData = postString.dataUsingEncoding(NSUTF8StringEncoding)!
    let base64LoginString = data.base64EncodedStringWithOptions(nil)
    let postLength=NSString(format: "%ld", data.length)

    let url = NSURL(string: "http://www.myurl.com/Token")
    let request = NSMutableURLRequest(URL: url!);
    request.HTTPMethod = "POST"
    request.HTTPBody = ""
    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.addValue("Basic " + base64LoginString, forHTTPHeaderField: "Authorization")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    request.setValue("0", forHTTPHeaderField: "Content-Length")

顺便说一下,如果你提供你的api url,那么找到你的错误要容易得多

答案 1 :(得分:0)

错误代码400表示服务器不了解请求,可能是请求格式错误。这很可能是客户端问题。但是,我编写了一个简单的python http服务器,并使用上面的代码(只更改了URL入口点),一切正常。我强烈建议您检查后端的API文档,并找出您的后端服务器无法识别您的请求的原因。您的客户端代码似乎是正确的。

自己试试: 创建 myserver.py ,并为其添加以下行:

from flask import Flask, request

app = Flask(__name__)

@app.route('/Token', methods=['POST'])
def hello_world():
    print(request.form)
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

从终端运行此python脚本,并将http://www.myurl.com更改为http://127.0.0.1:5000,您将看到请求通过,服务器可以正确解析您的用户名密码等。

根据后端API规范,尝试设置自己的本地Web服务器以在调试/开发期间模拟后端始终是一个好主意。

答案 2 :(得分:0)

尝试这个

//首先制作json对象。你可以使用你的对象。

    let JSONObject: [String : AnyObject] = [
        "DeviceHash" : UUIDValue,
        "DeviceName" : deviceNameValue!,
        "SerialKey": serialKeyValue!,



    ]




    if NSJSONSerialization.isValidJSONObject(JSONObject) {
        var request: NSMutableURLRequest = NSMutableURLRequest()
        let url = "Your Url"

        var err: NSError?

        request.URL = NSURL(string: url)
        request.HTTPMethod = "POST"
        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        do {
            request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(JSONObject, options: NSJSONWritingOptions())

            print(JSONObject)




        } catch {
            print("bad things happened")
        }


        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) {(response, data, error) -> Void in

            let httpResponse = response as! NSHTTPURLResponse
            if error != nil {

                print("error")

            }else {
             print(response)


            }


        }
    }