如何使用 akka-http_2.12 v10.0.6 执行简单的 http 请求

How to perform simple http request with akka-http_2.12 v10.0.6

我正在尝试通过制作查询 urls 的简单示例来学习 akka。我试图使用来自 Akka HTTP 官方 docs 的示例,但 "surprisingly" 官方文档已过时。

我试图在 Whosebug 上使用 ,但同样 - 它指的是过时的 API.

我的代码是:

import java.util.concurrent.CompletionStage;

import static akka.pattern.Patterns.pipe;

import akka.actor.AbstractActor;
import akka.http.javadsl.Http;
import akka.http.javadsl.model.HttpRequest;
import akka.http.javadsl.model.HttpResponse;
import akka.japi.pf.FI.UnitApply;
import akka.japi.pf.ReceiveBuilder;
import akka.stream.ActorMaterializer;
import akka.stream.Materializer;
import scala.concurrent.ExecutionContextExecutor;

public class RequestForPageActor extends AbstractActor {
    final Http http = Http.get(context().system());
    final ExecutionContextExecutor dispatcher = context().dispatcher();
    final Materializer materializer = ActorMaterializer.create(context());

    @Override
    public Receive createReceive() {
        return receiveBuilder().match(RequestForPage.class, onRequestForPage()).build();
        // TODO: Handle page response
    }

    private UnitApply<RequestForPage> onRequestForPage() {
        return request -> {
            pipe(fetch(request.getUrl()), dispatcher).to(self());
        };
    }

    CompletionStage<HttpResponse> fetch(String url) {
        return http.singleRequest(HttpRequest.create(url), materializer);
    }
}

问题是API变了。现在编译器的抱怨是:The method pipe(Future<T>, ExecutionContext) in the type Patterns is not applicable for the arguments (CompletionStage<HttpResponse>, ExecutionContextExecutor)

问题:那么,如何执行查询 url 和处理结果这一简单任务?

文档没有过时。您只是导入了错误的静态方法。

替换

import static akka.pattern.Patterns.pipe;

import static akka.pattern.PatternsCS.pipe;

PatternsCS 包含一堆与 CompletionStage 而不是 Future 一起工作的模式实现。可以在 docs page.

中找到一些用法示例