Отправить POST-запрос с параметрами в теле через Play WS API

#scala #web-services #playframework #playframework-2.0

#scala #веб-сервисы #playframework #playframework-2.0

Вопрос:

В настоящее время я отправляю запросы get через Play WS API следующим образом:

 wsClient
    .url(myUrl)
    .withQueryString(getParams(): _*)
    .get()
  

Теперь я хочу изменить этот вызов, чтобы использовать HTTP Post. При вызове следующего:

     wsClient
        .url(myUrl)
        .withMethod("POST")
        .withBody(getParams(): _*)
        .get()
  

Я получаю следующую ошибку:

Не удается записать экземпляр Seq[(String, String)] в HTTP-ответ. Попробуйте определить доступный для записи [Seq[(Строка, строка)]]

Я думаю, это потому, что метод getParams возвращает Seq[(String, String)] .

Как я могу это исправить?

Комментарии:

1. Вы должны завершить свой вызов .post() … Смотрите Документы .

2. Спасибо за ваш ответ. Я get() заменил post(getParams(): _*) и удалил .withBody(getParams(): _*) , но все равно получаю ту же ошибку.

3. Также .withBody(getParams(): _*) неверно.. Что вы отправляете как тело , какой-нибудь JSON, XML? Строка запроса — это просто параметры URL, например ?id=5amp;name=whatever .

4. Полезная нагрузка для POST-запроса должна быть примерно такой key123=val123amp;key456=val456 . getParams Seq[(String, String)] Например, мой метод возвращает a List("key123" -> "val123", "key456" -> "val456") .

Ответ №1:

При использовании http post пары значений ключа отправляются с использованием типа содержимого application/x-www-form-urlencoded

Вот код для публикации

  client.url(myUrl)
    .withHeaders("Content-type" -> "application/x-www-form-urlencoded")
    .post(getParams.map { case (k, v) => s"$k=$v"}.mkString("amp;"))
  

Комментарии:

1. Отлично! Большое вам спасибо! Хорошего дня.