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

标签 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 的实例还有一个ExecutionContext和一个 Materializer我在解码部分没有,它也返回 CompletionStage<String>这是完全多余的,因为我希望它同步完成。

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

Use the predefined Unmarshaller.entityToString, Unmarshaller.entityToByteString, Unmarshaller.entityToByteArray, Unmarshaller.entityToCharArray to convert to those basic types

如您所见,这不是很有用。

有什么想法吗?

最佳答案

您可以使用全局 ExecutionContext 和用于运行 akka-http 的相同 Materializer。您需要将发出 HTTP 请求的 FutureUnmarshaller 提供的Future 组合起来:

    import akka.actor.ActorSystem;
    import akka.dispatch.ExecutionContexts;
    import akka.http.javadsl.Http;
    import akka.http.javadsl.model.HttpRequest;
    import akka.http.javadsl.model.HttpResponse;
    import akka.http.javadsl.model.ResponseEntity;
    import akka.http.javadsl.unmarshalling.Unmarshaller;
    import akka.stream.ActorMaterializer;
    import akka.stream.Materializer;

    ActorSystem system = ActorSystem.create();
    Materializer materializer = ActorMaterializer.create(system);

    Http.get(system).
        singleRequest(HttpRequest.create("http://stackoverflow.com/"), materializer).
        thenCompose(response -> Unmarshaller.entityToString().unmarshal(response.entity(), ExecutionContexts.global(), materializer)).
        thenAccept(System.out::println);

关于java - Akka http 使用 java - 从 RequestEntity 获取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38445376/

相关文章:

c# - 向函数添加 'async' 关键字有什么缺点吗?

scala - 有没有关于如何将 akka-http 与 servlet 容器一起使用的示例?

java - 如何为多个(10k - 100k)请求正确调用 Akka HTTP 客户端?

java - 从 eclipse 使用 tomcat 服务器运行 web 项目

java - jToggleButton 的 while 循环错误 : JAVA

java - 获取两个标签之间的内容,然后返回完整的字符串

java - Akka远程actor部署文档错误

java - 通过反射迭代数组

javascript - 加载文件后如何将 promise 错误传播到更高的 promise 级别?

javascript - 从 Node.js 多次调用 Web 服务