2015-09-29 110 views
2

是否有任何无缝机制来执行来自Akka的平静请求(仅在java中使用akka)。有一个喷雾客户端http://spray.io/documentation/1.2.3/spray-client/,但它接缝没有Java或SSL支持API。
也有Akka-Http包,但仍然是实验性的,我找不到客户端api的说明。与Java的Akka中的REST客户端

到目前为止,我不得不使用Jersey客户端(https://jersey.java.net)和隐藏同步调用的阿卡路由器与演员做这个工作的一些游泳池背后的一种方法。

其他建议?

回答

2

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); 

阿卡HTTP不支持TLS/SSL。有一点不同于Play's WS的是它的水平更低,并且让你更好地控制如何/何时/什么。 WS更简单,也是异步的。 Akka HTTP能够响应正文,而WS和一些其他HTTP客户端无法做到这一点。使用Akka Streams获得响应正文流:response.entity().getResponseBytes(),这是一个Source<ByteString, ?>

无论是Play的WS还是Akka HTTP的客户端都应该尽你所需,挑选适合你的用例。如果你需要流媒体 - 阿卡,如果你需要非常简单的东西 - 播放。


跟进,如果你是从一个演员发出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); 
+0

这个例子更像是用一个演员系统的外部。如果我想从一个actor中发出一个http请求,我可以在actor列表中收到类似消息的响应吗? – George

+1

当然,只要使用'pipeTo'模式来获取'Future'作为消息,我会更新上面的答案。 –

+1

我已经添加了在演员中使用HTTP客户端的文档(一个完整的例子)的文档,这里是公关:https://github.com/akka/akka/pull/18611快乐的徒步! –