node.js - Swift http post 请求将空正文发送到服务器
问题描述
我正在尝试从 swift 到 nodejs 服务器执行一个简单的 http post 请求。当我运行以下代码时,正文似乎是空的。我已经尝试了几种变体,但没有成功。
客户: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 和 ExpressJs。
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 确实有效。所以我不确定是什么问题。
谢谢!
解决方案
终于想通了。问题出在服务器端。添加此行使其工作。(bp 是 NPM bodyParser)
app.use(bp.json()); // support json encoded bodies
现在的结果和预期的一样:
POST!
{ username: 'ausername', password: 'a password' }
推荐阅读
- unit-testing - 如何在 rspec 单元测试中隔离 Puppet 函数模拟
- c - 为什么我在使用我的 python 脚本运行 C 程序时得到相同的输出
- css - 滚动褪色卡片 - 有角度的(我接受图书馆的建议)
- amazon-s3 - Athena 生成的 TEXTFILE 为空
- python - 伺服电机无法按预期使用 pantilt 进行面部跟踪
- python - 未检测到 Python,无法执行脚本
- css - 将 2 个不同的应用程序合二为一
- angular - 从 sessionStorage.getItem() Angular 7 获取 NULL 值
- gitlab - 如何设置动态 gitlab-ci 文件
- android - android:versionCode="1" 和 android:versionCode="10100" 在 android 中是否相同?