Вызовите несколько API, используя akka HTTP - PullRequest
0 голосов
/ 10 ноября 2018

Я новичок в АККА, я пытаюсь выполнить 3 запроса, установить тайм-аут на ~ 1 секунду для каждого из них, объединить результаты.3 запроса или несколько запросов будут простым вызовом API, GET, где ответ от API будет в JSON.Пока что у меня есть код

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

    final Flow<HttpRequest, HttpResponse, CompletionStage<OutgoingConnection>> connectionFlow =
            Http.get(system).outgoingConnection(toHost("https://example/api/ticker", 80));
    final CompletionStage<HttpResponse> responseFuture =
            Source.single(HttpRequest.create("/"))
                    .via(connectionFlow)
                    .runWith(Sink.<HttpResponse>head(), materializer).;

Любая помощь по этому вопросу будет высоко оценен.

1 Ответ

0 голосов
/ 12 ноября 2018

Я не слишком знаком с java версией akka, поэтому приведенный ниже пример кода может не компилироваться, но он демонстрирует общую идею ...

Предположительно, у вас есть функции для преобразования ответа от предыдущих вызовов API в запросы следующего API:

public static HttpRequest convertAPI1Response(HttpResponse httpResponse) {

}

public static HttpRequest convertAPI2Response(HttpResponse httpResponse) {

}

Эти преобразователи могут быть помещены в Flow значения:

final Flow<HttpResponse, HttpRequest, ...> convertAPI1Flow = 
  Flow.of(HttpResponse.class).map(convertAPI1Response)

final Flow<HttpResponse, HttpRequest, ...> convertAPI2Flow = 
  Flow.of(HttpResponse.class).map(convertAPI1Response)

Эти потоки теперь можно использовать совместно с потоками outgoingConnection, на которые уже ссылается вопрос:

final Flow<HttpRequest, HttpResponse, CompletionStage<OutgoingConnection>> connection1Flow =
        Http.get(system).outgoingConnection(toHost("https://example/api/ticker", 80));

final Flow<HttpRequest, HttpResponse, CompletionStage<OutgoingConnection>> connection2Flow =
        Http.get(system).outgoingConnection(toHost("https://someOtherHost.com/api", 80));

final Flow<HttpRequest, HttpResponse, CompletionStage<OutgoingConnection>> connection3Flow =
        Http.get(system).outgoingConnection(toHost("https://someOtherOtherHost.com/api", 80));

И, наконец, все Потоки могут быть соединены вместе:

final CompletionStage<HttpResponse> responseFuture =
        Source.single(HttpRequest.create("/"))
              .via(connection1Flow)
              .via(convertAPI1Flow)
              .via(connection2Flow)
              .via(convertAPI2Flow)
              .via(connection3Flow)
              .runWith(Sink.<HttpResponse>head(), materializer).;
...