Идиоматический способ создания базового запроса HTTP-сообщения с помощью Akka HTTP

Я пытаюсь выяснить, как создать базовый HTTP-запрос POST с помощью библиотеки Akka HTTP. Вот что я придумал:

val formData = Await.result(Marshal(FormData(combinedParams)).to[RequestEntity], Duration.Inf)
val r = HttpRequest(POST, url, headers, formData)

Дело в том, что для меня это кажется немного неидиоматичным. Существуют ли другие способы создания HttpEntity из FormData? Особенно тот факт, что я должен использовать Await или возвращать Будущее, даже несмотря на то, что данные легко доступны, кажется слишком сложным для такой простой задачи.

Ответ 1

По-видимому, в некоторый момент в класс FormData был добавлен метод toEntity. Итак, теперь это похоже на простейшее решение проблемы:

val formData = FormData(combinedParams).toEntity
val r = HttpRequest(POST, url, headers, formData)

Ответ 2

Вы можете использовать Marshal в для понимания с другими фьючерсами, такими как те, которые вам нужно отправить, и отменить маркер ответа:

val content = for {
        request <- Marshal(formData).to[RequestEntity]
        response <- Http().singleRequest(HttpRequest(method = HttpMethods.POST, uri = s"http://example.com/test", entity = request))
        entity <- Unmarshal(response.entity).to[String]
      } yield entity

Ответ 3

Вы также можете использовать RequestBuilding:

Http().singleRequest(RequestBuilding.Post(url, formData)).flatMap(Unmarshal(_).to[String])