我正在尝试将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制作的但没有成功的东西。
感谢您的帮助!
答案 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())
,您就可以开始使用