我正试图获取一个http请求的正文,但它似乎并不像听起来那么简单,除非我当然缺少一些东西。
我有一个HttpRequest
的实例(来自akka.http.javadsl.model
),我可以得到RequestEntity
,但我无法弄清楚如何从中提取字符串实体。
我想同步这样做,只是一个简单的操作就是把字符串从那里拿出来。
我尝试了两种不同的路径:
(1)
Source<ByteString, Object> source = RequestEntity.getDataBytes();
我不确定我应该对source
做什么,它有很多方法,而且不清楚如何使用它们,如果它们中的任何一个可以真正帮助我。
(2)
Unmarshaller<HttpEntity, String> unmarshaller = Unmarshaller.entityToString();
CompletionStage<String> result = unmarshaller.unmarshall(entity, ExecutionContext, Materializer);
调用unmarshaller.unmarshall
不仅需要RequestEntity
的实例,还需要我在解组时没有的ExecutionContext
和Materializer
,也会返回CompletionStage<String>
这完全是多余的,因为我希望它能够同步完成。
java的文档和示例没有多大帮助,因为它们非常简短,如果它们存在则很简短,例如在Marshalling & Unmarshalling section中:
使用预定义的Unmarshaller.entityToString, Unmarshaller.entityToByteString,Unmarshaller.entityToByteArray, Unmarshaller.entityToCharArray转换为那些基本类型
正如您所看到的,这不是很有用。
有什么想法吗?
答案 0 :(得分:2)
您可以使用全局ExecutionContext
和用于运行Materializer
的{{1}}。您需要撰写使用akka-http
提供的HTTP请求的Future
:
Unmarshaller
答案 1 :(得分:0)
Java文档非常重要,这是缺少样本的领域之一。
使用entity
指令使用其中一个预定义的编组来回答您的具体问题,如下所示:
path("example", () ->
entity(Unmarshaller.entityToString(), (string) -> {
System.out.println("request body: " + string);
return complete("ok");
})
)
请注意,它会将整个请求主体读入JVM的内存中,这可能需要一些想法。对于请求主体,默认限制为8M,可以通过配置更改或使用withSizeLimit
和withoutSizeLimit
指令覆盖特定路径。
我已经开通了Akka机票21001,以跟踪将其添加到文档中。