Akka 中的 REST 客户端 Java

REST Client in Akka with Java

是否有任何无缝机制来执行来自 Akka 的 restful 请求(仅将 akka 与 java 结合使用)。有一个 spray 客户端 http://spray.io/documentation/1.2.3/spray-client/ 但它似乎没有 api 用于 java 也没有 ssl 支持。
还有 Akka-Http 包,但仍处于试验阶段,我找不到客户端的描述 api。

到目前为止,我有一种方法可以使用 jersey 客户端 (https://jersey.java.net) 并将同步调用隐藏在 Akka 路由器后面,并由一些参与者执行这项工作。

还有其他建议吗?

Akka HTTP 附带一个客户端 API,并且由于 Typesafe 支持的所有内容,我们还为其提供了 Java API。 Documentation for the client side API is available online.

有许多不同的 API 可供选择,阅读上面的文档,但最简单的是 singleRequest:

// valid for Akka Http 1.0 (experimental), APIs may change slightly still
final ActorSystem system = ActorSystem.create();
final ActorMaterializer materializer = ActorMaterializer.create(system);

final Future<HttpResponse> responseFuture =
  Http.get(system)
    .singleRequest(HttpRequest.create("http://akka.io"), materializer);

Akka HTTP 支持 TLS/SSL。它与 Play's WS is that it's more low level, and gives you more control over how/when/what. WS is simpler to use and also asynchronous. Akka HTTP is able to stream the response body, whereas WS and some other HTTP clients are not able to do this. The streaming is achieved using Akka Streams 的不同之处在于获取响应主体流:response.entity().getResponseBytes() 这是一个 Source<ByteString, ?>.

Play 的 WS 或 Akka HTTP 的客户端应该可以满足您的所有需求,选择更适合您的用例。如果您需要流式传输 - Akka,如果您需要非常简单的东西 - 播放。


如果您从 Actor 发出 Http 请求并希望响应以消息的形式返回,请跟进。您可以使用 pipeTo 模式将 Future 传送回 Actor,如下所示:

import static akka.pattern.Patterns.pipe;
// ... 

Future<HttpResponse> response = Http.get(system)
  .singleRequest(HttpRequest.create("http://akka.io"), materializer);
pipe(response, context.dispatcher()).to(self);