복붙노트

[SPRING] 자바 - OkHttp 비동기 GET 결과 검색

SPRING

자바 - OkHttp 비동기 GET 결과 검색

그래서 스프링 부트 (Spring Boot)에서 웹 애플리케이션을 가지고 있으며, API에 많은 HTTP 요청을하는 부분이있다. 요청이 너무 많이 발생하면 시간 초과 된 것으로 보인다. 동기식에서 비동기식 요청으로 전환하면이 문제를 해결할 수 있다고 들었습니다.

OkHttp를 사용하면 내 동기 GET 요청은 다음과 같습니다.

private JSONObject run(String url) throws Exception {
    Request newRequest = new Request.Builder()
            .url(url)
            .addHeader("Authorization", token)
            .build();

    try (Response response = client.newCall(newRequest).execute()) {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
        return new JSONObject(response.body().string());

    }
}

응답 본문을 파싱하여 JSON 개체로 응답을 반환합니다. 그러나 OkHttp 비동기 호출을 사용하려고 할 때 동일한 접근 방식을 사용할 수없는 것으로 보입니다. 이것은 내가 지금까지 가지고있는 것이다 :

public void runAsync(String url) throws Exception {
    Request request = new Request.Builder()
            .url(url)
            .addHeader("Authorization", token)
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        @Override public void onResponse(Call call, Response response) throws IOException {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            System.out.println(response.body().string());
        }
    });
}

리턴 값이 void 인 콜백 메소드 내부에 응답이 래핑되므로 결과를 JSON으로 간단히 리턴 할 수 없습니다. 응답을 추출하는 동기 GET과 비슷한 결과를 얻을 수있는 방법에 대한 아이디어가 있습니까?

해결법

  1. ==============================

    1.나는 스프링 부트의 사용자가 아니므로 완전한 대답은 아닙니다. 하지만 미래를 돌려주는 것을 지원한다면, OkHttp 콜백에서 미래로 연결하는 것은 쉽지 않습니다.

    나는 스프링 부트의 사용자가 아니므로 완전한 대답은 아닙니다. 하지만 미래를 돌려주는 것을 지원한다면, OkHttp 콜백에서 미래로 연결하는 것은 쉽지 않습니다.

    관련있을 수 있습니다 https://spring.io/guides/gs/async-method/

    미래를 낳는 방법

    public class OkHttpResponseFuture implements Callback {
      public final CompletableFuture<Response> future = new CompletableFuture<>();
    
      public OkHttpResponseFuture() {
      }
    
      @Override public void onFailure(Call call, IOException e) {
        future.completeExceptionally(e);
      }
    
      @Override public void onResponse(Call call, Response response) throws IOException {
        future.complete(response);
      }
    }
    

    그런 다음 작업을 대기열에 올려 놓습니다.

      OkHttpResponseFuture callback = new OkHttpResponseFuture();
      client.newCall(request).enqueue(callback);
    
      return callback.future.thenApply(response -> {
        try {
          return convertResponse(response);
        } catch (IOException e) {
          throw Throwables.propagate(e);
        } finally {
          response.close();
        }
      });
    

    처리 요청이 여러 개인 경우 별도로 제출하고 결합하여 반환하기 전에 사용 가능한 모든 결과를 기다릴 수 있습니다.

      public static <T> CompletableFuture<List<T>> join(List<CompletableFuture<T>> futures) {
        CompletableFuture[] cfs = futures.toArray(new CompletableFuture[futures.size()]);
    
        return CompletableFuture.allOf(cfs)
            .thenApply(v -> combineIndividualResults(c));
      }
    
  2. from https://stackoverflow.com/questions/42308439/java-retrieving-result-from-okhttp-asynchronous-get by cc-by-sa and MIT license