对NSURLRequest Swift进行Curl命令

时间:2016-07-27 07:59:13

标签: ios swift curl nsmutableurlrequest

我正在转换以下curl命令:

curl -X PUT -H "Authorization: Bearer 34kjsfhjbdjkh.jdhfds334jdshfksfs.kkjkjdsakjsd" -d "current_pwd=oldpassword&new_pwd1=newpassword&new_pwd2=newpassword" localhost:3000/updateDetails

进入NSURLRequest

 func updatePassword(passwordInfo : NSDictionary){
    let urlString = generateURLString("/updateDetails")

    if let url = NSURL(string: urlString) {
        let currPwd = passwordInfo["currPwd"] as! String
        let nPwd1 = passwordInfo["newPwd1"] as! String
        let nPwd2 = passwordInfo["newPwd2"] as! String

        var stringPost = "current_pwd=" + currPwd
        stringPost += "&new_pwd1=" + nPwd1
        stringPost += "&new_pwd2=" + nPwd2

        let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding)

        let request = NSMutableURLRequest(URL: url)

        request.HTTPMethod = "PUT"
        request.addValue("Bearer " + getSessionToken(), forHTTPHeaderField: "Authorization")
        request.HTTPBody=data

        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithRequest(request){
            (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
            if let httpResponse = response as? NSHTTPURLResponse {
                if httpResponse.statusCode == 200 {
                    if let responseData = data {
                        let json = JSON(data: responseData)
                    }
                }
            }
        }
        task.resume()
    }
}

curl命令工作正常。 我使用node.js表达框架来运行服务器。

var currentPwd = req.body.current_pwd;
var newPwd1 = req.body.new_pwd1;
var newPwd2 = req.body.new_pwd2;

通过curl命令发送时,服务器上会收到密码值。当通过iOS发送请求时,newPwd1值或三者中的任何一个都是未定义的。知道为什么吗?我错过了什么吗?

更新: 用于正文解析的Express 4配置如下:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

更新2 : 这似乎很奇怪。当我尝试使用curl命令打印请求正文的日志时:请求正文似乎有效

{ current_pwd: 'oldPwd',
  new_pwd1: 'newPwd',
  new_pwd2: 'newPwd' }

当使用iOS NSURLRequest为请求正文打印日志时,我得到一个空主体: {}

1 个答案:

答案 0 :(得分:0)

我必须设置标题字段'Content-type'的值。

request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-type")

修正了它。