使用java的Akka http - 从RequestEntity获取字符串

时间:2016-07-18 20:22:03

标签: java asynchronous akka unmarshalling akka-http

我正试图获取一个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的实例,还需要我在解组时没有的ExecutionContextMaterializer,也会返回CompletionStage<String>这完全是多余的,因为我希望它能够同步完成。

java的文档和示例没有多大帮助,因为它们非常简短,如果它们存在则很简短,例如在Marshalling & Unmarshalling section中:

  

使用预定义的Unmarshaller.entityToString,   Unmarshaller.entityToByteString,Unmarshaller.entityToByteArray,   Unmarshaller.entityToCharArray转换为那些基本类型

正如您所看到的,这不是很有用。

有什么想法吗?

2 个答案:

答案 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,可以通过配置更改或使用withSizeLimitwithoutSizeLimit指令覆盖特定路径。

我已经开通了Akka机票21001,以跟踪将其添加到文档中。