Java - Retrieving Result from OkHttp Asynchronous GET
因此,我在Spring Boot中有一个Web应用程序,在某个部分中,我向API发出了许多HTTP请求,并且如果发出过多的请求,似乎会超时。 我听说从同步请求切换到异步请求可能会解决此问题。
使用OkHttp,这就是我的同步GET请求的样子:
1 2 3 4 5 6 7 8 9 10 11 12 | 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异步调用时,似乎无法使用相同的方法。 这是我到目前为止的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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()); } }); } |
我不能简单地以JSON形式返回结果,因为响应包含在Callback方法中,该方法的返回值为void。 关于如何获得与提取响应的同步GET类似的结果的任何想法?
我不是Spring Boot的用户,所以这不是一个完整的答案。 但是,如果它支持返回Future,那么从OkHttp Callback到Future桥接是很简单的。
这可能与https://spring.io/guides/gs/async-method/有关
至于创造未来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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); } } |
然后将工作排队
1 2 3 4 5 6 7 8 9 10 11 12 | 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(); } }); |
如果您有多个请求要处理,则可以分别提交它们,然后等待所有结果可用,然后再合并并返回
1 2 3 4 5 6 | 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)); } |