Как отправить запрос POST с помощью приложения Content-Type/x-www-form-urlencoded

Я пытаюсь отправить запрос POST из моего приложения TornadoFX на мой сервер nodejs.

Вот как я отправляю свой запрос на сервер:

val api: Rest by inject()

api.baseURI = "http://localhost:5000/"

api.post("api/register", userModel) {
    it.addHeader("Content-Type", "application/x-www-form-urlencoded")
}

Моя UserModel выглядит так:

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":"[email protected]"}': ''
}

Когда я отправляю запрос через Postman, я получаю следующее тело:

[Object: null prototype] {
  name: 'Test',
  email: '[email protected]'
}
И это то, что я безуспешно пытаюсь создать с помощью TornadoFX. Я благодарен за любую помощь!


person FabianK    schedule 09.08.2019    source источник


Ответы (1)


Вы правильно устанавливаете заголовок Content-Type, но вы отправляете JsonModel в качестве своих данных, и, следовательно, фреймворк преобразует его в структуру JSON, вызывая для него toJSON(). Тип содержимого 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()), и все готово.

person Edvin Syse    schedule 12.08.2019
comment
Спасибо за Ваш ответ. Я обновил TornadoFX с версии 1.7.17 до версии 1.7.19, и теперь он работает без кодирования значений. - person FabianK; 12.08.2019