如何发送内容类型为 "application/x-www-form-urlencoded" 的 POST 请求
How to send a POST request with Content-Type "application/x-www-form-urlencoded"
我正在尝试从我的 TornadoFX 应用程序向我的 nodejs 服务器发送 POST 请求。
这就是我向服务器发送请求的方式:
val api: Rest by inject()
api.baseURI = "http://localhost:5000/"
api.post("api/register", userModel) {
it.addHeader("Content-Type", "application/x-www-form-urlencoded")
}
我的用户模型看起来像这样:
class UserModel : JsonModel {
val nameProperty = SimpleStringProperty("")
var name by nameProperty
val emailProperty = SimpleStringProperty("")
var email by emailProperty
override fun toJSON(json: JsonBuilder) {
with(json) {
add("name", name)
add("email", email)
}
}
}
在我的节点服务器上打印请求正文我得到以下信息:
[Object: null prototype] {
'{"name":"Test","email":"test@test.org"}': ''
}
当我通过邮递员发送请求时,我得到以下正文:
[Object: null prototype] {
name: 'Test',
email: 'test@test.org'
}
这就是我试图用 TornadoFX 制作的东西,但没有成功。
我很感激任何帮助!
您正确设置了 Content-Type header,但您将 JsonModel 作为数据推送,因此框架将通过调用 JSON 将其转换为 JSON 结构=12=]就可以了。 application/x-www-form-urlencoded 内容类型需要一段 URL 编码的数据,因此您需要将数据转换为 url 编码的字符串。我建议像这样向您的域模型添加一个函数:
fun toURLEncoded() =
"name=${name.urlEncoded}&email=${email.urlEncoded}".byteInputStream(StandardCharsets.UTF_8)
此示例使用名为 urlEncoded
的扩展函数来避免混乱。您可以像这样定义扩展函数,例如:
fun Any.urlEncoded(): String = URLEncoder.encode(toString(), "UTF-8")
现在您只需拨打 api.post("api/register", userModel.toURLEncoded())
就可以开始了。
我正在尝试从我的 TornadoFX 应用程序向我的 nodejs 服务器发送 POST 请求。
这就是我向服务器发送请求的方式:
val api: Rest by inject()
api.baseURI = "http://localhost:5000/"
api.post("api/register", userModel) {
it.addHeader("Content-Type", "application/x-www-form-urlencoded")
}
我的用户模型看起来像这样:
class UserModel : JsonModel {
val nameProperty = SimpleStringProperty("")
var name by nameProperty
val emailProperty = SimpleStringProperty("")
var email by emailProperty
override fun toJSON(json: JsonBuilder) {
with(json) {
add("name", name)
add("email", email)
}
}
}
在我的节点服务器上打印请求正文我得到以下信息:
[Object: null prototype] {
'{"name":"Test","email":"test@test.org"}': ''
}
当我通过邮递员发送请求时,我得到以下正文:
[Object: null prototype] {
name: 'Test',
email: 'test@test.org'
}
这就是我试图用 TornadoFX 制作的东西,但没有成功。
我很感激任何帮助!
您正确设置了 Content-Type header,但您将 JsonModel 作为数据推送,因此框架将通过调用 JSON 将其转换为 JSON 结构=12=]就可以了。 application/x-www-form-urlencoded 内容类型需要一段 URL 编码的数据,因此您需要将数据转换为 url 编码的字符串。我建议像这样向您的域模型添加一个函数:
fun toURLEncoded() =
"name=${name.urlEncoded}&email=${email.urlEncoded}".byteInputStream(StandardCharsets.UTF_8)
此示例使用名为 urlEncoded
的扩展函数来避免混乱。您可以像这样定义扩展函数,例如:
fun Any.urlEncoded(): String = URLEncoder.encode(toString(), "UTF-8")
现在您只需拨打 api.post("api/register", userModel.toURLEncoded())
就可以开始了。