如何发送内容类型为 "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()) 就可以开始了。