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

时间:2019-08-09 16:16:41

标签: rest post tornadofx

我正在尝试将TornadoFX应用程序中的POST请求发送到我的nodejs服务器。

这就是我将请求发送到服务器的方式:

+---------+----------+-------+------------+----+
| member  | product  | cost  | totalcost  | rn |
+---------+----------+-------+------------+----+
| Joe     | A123     |  150  |       250  |  1 |
| Joe     | A789     |  100  |       250  |  1 |
| Bob     | C321     |   50  |       175  |  2 |
| Bob     | A123     |  125  |       175  |  2 |
| Anord   | A100     |   50  |       100  |  3 |
| Anord   | A123     |   50  |       100  |  3 |
| Aruna   | A123     |   50  |        50  |  4 |
| Jack    | A123     |   50  |        50  |  5 |
| Jake    | A123     |   50  |        50  |  6 |
| Karma   | A123     |   50  |        50  |  7 |
| Logan   | A123     |   50  |        50  |  8 |
| Paul    | A123     |   50  |        50  |  9 |
| Rock    | A123     |   50  |        50  | 10 |
| Seetha  | A123     |   50  |        50  | 11 |
+---------+----------+-------+------------+----+
Record Count: 14

我的UserModel看起来像这样:

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"}': ''
}
那就是我试图用TornadoFX制作的但没有成功的东西。 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您正确设置了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.post("api/register", userModel.toURLEncoded()),您就可以开始使用