POST请求不包括params \ JSON

时间:2017-10-21 03:27:48

标签: ios swift

我已经设置了api post请求,这对postman工作正常,但是在我的swift代码中它不会发送带有请求的params。

let parameters = ["spotId" : spotId,
                      "voteruptime" : currentDate,
                      "voterupid" : userId] as [String : Any]

    guard let url = URL(string: "http://example.com:3000/upvote") else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("Application/json", forHTTPHeaderField: "Content-Type")
    guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return }
    request.httpBody = httpBody
    print(request.httpBody)

    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if let response = response {
            print(response)
        }

        if let data = data {
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: [])
                print(json)
            } catch {
                print(error)
            }
        }

        }.resume()

我收到了回复

<NSHTTPURLResponse: 0x618000a26560> { URL: http://example.com:3000/upvote } { status code: 200, headers {
Connection = "keep-alive";
"Content-Length" = 28;
"Content-Type" = "application/json; charset=utf-8";
Date = "Sat, 21 Oct 2017 03:11:46 GMT";
Etag = "W/\"1c-BWaocQVSSeKjLiaYjOC8+MGSQnc\"";
"X-Powered-By" = Express;} }

{
    n = 0;
    nModified = 0;
    ok = 1;
}

服务器代码Node JS是:

app.post('/upvote', function(req, res){

    Spots.update({_id: req.query.spotId},{$push:{'upvotes':{'voterupid':req.query.voterupid,'voteruptime':req.query.voteruptime}}},function( err, Spots){
    console.log(req.url)


if(err){
                throw err;
                }
    res.json(Spots);
});

});

我也试过了alamofire,这是同样的问题,没有发送到服务器的params。

1 个答案:

答案 0 :(得分:0)

我认为问题在于req.query访问在查询字符串上传递的数据,而您正在POST请求正文中的数据。

要访问正文,您需要使用身体解析器,如多个答案中所述:How to access the request body when POSTing using Node.js and Express?