使用Java
的新HTTP2
支持,我无法找到任何出色的例子来概述。
在Java的早期版本(Java 8
中,我使用多个线程多次调用REST
服务器。
我有一个全局参数列表,我将遍历这些参数以提出不同种类的请求。
例如:
String[] params = {"param1","param2","param3" ..... "paramSomeBigNumber"};
for (int i = 0 ; i < params.length ; i++){
String targetURL= "http://ohellothere.notarealdomain.commmmm?a=" + params[i];
HttpURLConnection connection = null;
URL url = new URL(targetURL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
//Send request
DataOutputStream wr = new DataOutputStream (
connection.getOutputStream());
wr.writeBytes(urlParameters);
wr.close();
//Get Response
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
//Do some stuff with this specific http response
}
在前面的代码中,我要做的是在同一个服务器上构造多个HTTP
请求,只是对参数进行了少许更改。这花了一段时间才完成,所以我什至会使用线程来分解工作,以便每个线程都可以在param数组的某些块上工作。
有了HTTP2
,我现在不必每次都创建一个全新的连接。问题是,我不太明白如何实现此使用Java的新版本(Java 9 - 11
)。
如果我像以前一样拥有数组参数,我将如何执行以下操作:
1) Re-use the same connection?
2) Allow different threads to use the same connection?
基本上我正在寻找一个例子做什么,我以前做什么,但现在使用HTTP2
致谢
答案 0 :(得分:9)
这花了一段时间,所以我什至会使用线程来分拆工作,以便每个线程都可以在param数组的某些块上工作。
使用Java 11的HttpClient
,实际上非常容易实现;您只需要以下代码段:
var client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).build();
String[] params = {"param1", "param2", "param3", "paramSomeBigNumber"};
for (var param : params) {
var targetURL = "http://ohellothere.notarealdomain.commmmm?a=" + param;
var request = HttpRequest.newBuilder().GET().uri(new URI(targetURL)).build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.whenComplete((response, exception) -> {
// Handle response/exception here
});
}
这使用HTTP / 2异步发送请求,然后在回调中接收到响应String
(或Throwable
)后进行处理。