我正在创建一个连接到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时,数据已经存在,但是由于某种原因服务器没有收到它。
答案 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