JSONSerialization делает неправильный объект JSON. стриж - PullRequest
0 голосов
/ 30 октября 2018

Я создаю приложение для iOS, которое подключается к серверу NodeJS. Метод get работает нормально, но у метода POST есть проблемы.

var urlRequest = URLRequest(url: "http://localhost:3000/register")
urlRequest.httpMethod = "POST"
let info: [String:Any] = ["username": "username", "password":"username", "email":"username@username.com"]
do {
    let jsonInfo = try 
    JSONSerialization.data(withJSONObject: info, options[])
    urlRequest.httpBody = jsonInfo
} catch {
    print("ERROR")
    return
}

Запрос отправляется, но с JSONSerialization что-то идет не так, потому что это данные JSON, которые получает сервер: {'{"email":"username@username.com","username":"username","password":"username"}': '' }

Вот к чему я иду: {"email":"username@username.com","username":"username","password":"username"}

Это часть кода сервера:

const express = require('express');
const bodyParser = require('body-parser');
var app = express();
var allowMethods = function(req, res, next) {
res.header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE');
next();
}
http.createServer(app).listen(3001);
console.log("Server started");
app.use(bodyParser.urlencoded({extended: true}));
app.use(allowMethods);

const _ = require('lodash');
let b = _.pick(req.body, ['username', 'password', 'email']);

Есть идеи, что я делаю не так? Я хотел бы избежать использования alamofire, если это возможно. Я пытался изменить формат словаря, но всегда получается так:

{ 'the whole dictionary is the key': ''}

Я также пытался использовать красивую печать, и это было результатом:

{ '{\n  "email" : "username@username.com",\n  "username" : "username",\n  "password" : "username"\n}': '' }

Любая помощь приветствуется. Спасибо!

EDIT:

Я попробовал предложения Майка Таверна. Я изменил код сервера, чтобы использовать это вместо:

app.use(bodyParser.json());

Но я получаю пустое тело от симулятора. Я также добавил их в быстрый код:

urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")

Но сервер также получает пустое тело, и под пустым телом я подразумеваю, что данные, которые я пытаюсь отправить, принимаются сервером как пустые. Когда я проверяю httpBody, данные там, но по какой-то причине сервер их не получает.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Я решил это, изменив сами данные. Вместо того, чтобы заставлять его передавать JSON, я передал его в виде строки, закодированной с использованием UTF8

let dataString = "username=username&password=username&email=username@username.com"
urlRequest.httpBody = dataString.data(using: .utf8)

Я получил ответ, используя метод в этом посте: HTTP-запрос в Swift с методом POST

0 голосов
/ 30 октября 2018

Я считаю, что ваш код Swift в порядке. Когда я делал это на детской площадке:

print(String(data: urlRequest.httpBody!, encoding: String.Encoding.utf8)!)

напечатано:

{"username":"username","password":"username","email":"username@username.com"}

Я не эксперт по body-parser, но думаю, что вместо этого:

bodyParser.urlencoded({extended: true})

Вы должны использовать это:

bodyParser.json([options]) //not sure which options exactly you need

Возможно, вам также понадобится установить заголовок Content-Type: application/json. Обратитесь к документации body-parser для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...