Rest 如何发送内容类型为“application/x-www-form-urlencoded”的POST请求

Rest 如何发送内容类型为“application/x-www-form-urlencoded”的POST请求,rest,post,tornadofx,Rest,Post,Tornadofx,我正在尝试从我的TornadFX应用程序向我的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") } 我的用户模型如下所示:

我正在尝试从我的TornadFX应用程序向我的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头,但您将JsonModel作为数据推送,因此框架将通过调用toJSON将其转换为JSON结构。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.postapi/register、userModel.tourencoded,就可以了。

谢谢您的回答。我已将TornadoFX从1.7.17版更新为1.7.19版,现在它可以在不编码值的情况下工作。