使用 Akka HTTP 创建基本 HTTP Post 请求的惯用方法

Idiomatic way to create a basic HTTP Post request with Akka HTTP

我正在尝试了解如何使用 Akka HTTP 库创建基本的 HTTP POST 请求。这是我想出的:

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

问题是它对我来说似乎有点不习惯。还有其他方法可以从 FormData 创建 HttpEntity 吗?尤其是我必须使用 Await 或 return 一个 Future 的事实,即使数据很容易获得,对于这样一个简单的任务来说似乎过于复杂。

您可以使用 Marshal 来理解其他 Future,例如您需要发送请求和解组响应的 Future:

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

显然,toEntity 方法已添加到 FormData class 中。所以现在这似乎是解决问题的最简单方法:

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

你也可以使用RequestBuilding:

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