JSONSerialization使不正确的JSON对象。斯威夫特

时间:2018-10-30 03:19:28

标签: node.js json swift

我正在创建一个连接到NodeJS服务器的iOS应用。 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}': '' }

感谢您的帮助。谢谢!

编辑:

我尝试了Mike Taverne的建议。 我更改了服务器代码以改为使用它:

app.use(bodyParser.json());

但是我从模拟器收到一个空的尸体。 我还将这些添加到了快速代码中:

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

但是服务器也接收到一个空的主体,用空主体表示我要发送的数据被服务器接收为空。当我检查httpBody时,数据已经存在,但是由于某种原因服务器没有收到它。

2 个答案:

答案 0 :(得分:1)

我相信您的Swift代码很好。当我在操场上这样做时:

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

打印:

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

我不是人体分析专家,但是我认为不是这样:

bodyParser.urlencoded({extended: true})

您应该使用此:

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

您可能还需要设置Content-Type: application/json标头。有关更多信息,请参见http://wiki.phoenix.com/wiki/index.php/EFI_GRAPHICS_OUTPUT_PROTOCOL

答案 1 :(得分:0)

我通过更改数据本身解决了它。我没有强迫它传递JSON,而是将其传递为使用UTF8编码的字符串。

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

我通过使用本文中的方法得到了答案: HTTP Request in Swift with POST method