Свифт http post-запрос отправляет пустое тело на сервер - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь выполнить простой http-запрос с swift на сервер nodejs.Когда я запускаю следующий код, тело кажется пустым.Я попробовал несколько вариантов, но безуспешно.

КЛИЕНТ: SWIFT 5.

func api_post(){

        struct User: Codable {
            let username: String
            let password: String
        }

        let user = User(username: "ausername",password: "apassword")
        guard let uploadData = try? JSONEncoder().encode(user) else {
            return
        }



        let session = URLSession.shared
        let url = URL(string: "http://XXX.XXX.XXX.XXX:XXXX/post")
        var request = URLRequest(url: url!)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("application/json", forHTTPHeaderField: "Accept")
        request.httpBody = uploadData




          let task = session.uploadTask(with: request, from: uploadData) { data, response, error in
            if let error = error {
                print ("ERROR: \(error)")
                return
            }
            guard let response = response as? HTTPURLResponse,
                (200...299).contains(response.statusCode) else {
                    print ("SERVER ERROR")
                    return
                }
            if let mimeType = response.mimeType,
                mimeType == "application/json",
                let data = data,
                let dataString = String(data: data, encoding: .utf8) {
                print ("RETURNED DATA: \(dataString)")
            }
        }
        task.resume()

}

Результат:

POST!
{}

CURL в тот же URL-адрес работает, как ожидалось:

curl -d "username=ausername&password=apassword" -X POST http://XXX.XXX.XXX.XXX:XXX/post

Результат:

FROM SERVER: POST RESPONSE [OK]

СЕРВЕР: NodeJs и ExpressJ.

const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const port = XXXX

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





app.post('/post', function (req, res) {
    console.log("POST!");
    var data = JSON.stringify(req.body,null,2);
    console.log(data)
    res.send ("FROM SERVER: POST RESPONSE [OK]");
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

Я скопировал и вставил из документации Swift, но она не работает должным образом.Я подозреваю код моего сервера, но curl работает.Поэтому я не уверен, в чем проблема.

Спасибо!

1 Ответ

0 голосов
/ 24 июня 2019

Наконец разобрался. Проблема была на стороне сервера. Добавление этой строки заставило это работать. (bp - NPM bodyParser)

app.use(bp.json()); // support json encoded bodies

Результат теперь, как и ожидалось:

POST!
{ username: 'ausername', password: 'a password' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...