如何在HttpRequest Java11中添加基于多个条件的headers?
How to add headers based on multiple conditions to HttpRequest Java 11?
我正在学习 java.net.http api,尝试下载给定已下载字节范围的文件。为此,可以使用 range
header(假设服务器支持此类功能)。
使用 org.apache.http.client.methods.HttpGet
我可以做到这一点:
HttpGet httpGet= new HttpGet("http://exampleURL.com/aFile");
if (myFile.length() > 0) {
httpGet.addHeader("Range", "bytes=" + myFile.length() + "-"+totalBytes));
}
httpGet.addHeader("xxxx", "yyyy");//ok
现在使用 HttpRequest 我不能动态添加新的 headers,我必须创建一个新的整个 HttpRequest:
HttpRequest request = null;
if (myFile.length() > 0) {
request = HttpRequest.newBuilder()
.uri(URI.create("http://exampleURL.com/aFile"))
.header("Range","bytes="+myFile.length() +"-"+ totalBytes)
.build();
}else{
request = HttpRequest.newBuilder()
.uri(URI.create("http://exampleURL.com/aFile"))
.build();
}
request.header("xxxx","yyyyy")//Can't do this anymore
我有办法动态添加它们吗?
我看到文档说:
Once built an HttpRequest is immutable, and can be sent multiple times.
但是不可变有什么意义呢?如果我出于任何原因需要修改 headers 怎么办?
参考:
另一种方法是在完成 HttpRequest
的 build
链之前确定所有可能的 headers 并将它们与 HttpRequest.Builder#headers
一起使用:
List<String> headers = new ArrayList<>();
if (myFile.length() > 0) {
headers.add("Range");
headers.add("bytes=" + myFile.length() + "-" + totalBytes);
}
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://exampleURL.com/aFile"))
.headers(headers.toArray(String[]::new))
.build();
正如 Albjenow 所建议的,您可以先创建具有公共字段的构建器,然后在应用您的逻辑后构建最终请求。它看起来像:
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("http://exampleURL.com/aFile"));
if (myFile.length() > 0) {
requestBuilder.header("Range","bytes="+myFile.length() +"-"+ totalBytes);
}
requestBuilder.header("xxxx","yyyyy");
HttpRequest request = requestBuilder.build();
我正在学习 java.net.http api,尝试下载给定已下载字节范围的文件。为此,可以使用 range
header(假设服务器支持此类功能)。
使用 org.apache.http.client.methods.HttpGet
我可以做到这一点:
HttpGet httpGet= new HttpGet("http://exampleURL.com/aFile");
if (myFile.length() > 0) {
httpGet.addHeader("Range", "bytes=" + myFile.length() + "-"+totalBytes));
}
httpGet.addHeader("xxxx", "yyyy");//ok
现在使用 HttpRequest 我不能动态添加新的 headers,我必须创建一个新的整个 HttpRequest:
HttpRequest request = null;
if (myFile.length() > 0) {
request = HttpRequest.newBuilder()
.uri(URI.create("http://exampleURL.com/aFile"))
.header("Range","bytes="+myFile.length() +"-"+ totalBytes)
.build();
}else{
request = HttpRequest.newBuilder()
.uri(URI.create("http://exampleURL.com/aFile"))
.build();
}
request.header("xxxx","yyyyy")//Can't do this anymore
我有办法动态添加它们吗?
我看到文档说:
Once built an HttpRequest is immutable, and can be sent multiple times.
但是不可变有什么意义呢?如果我出于任何原因需要修改 headers 怎么办?
参考:
另一种方法是在完成 HttpRequest
的 build
链之前确定所有可能的 headers 并将它们与 HttpRequest.Builder#headers
一起使用:
List<String> headers = new ArrayList<>();
if (myFile.length() > 0) {
headers.add("Range");
headers.add("bytes=" + myFile.length() + "-" + totalBytes);
}
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://exampleURL.com/aFile"))
.headers(headers.toArray(String[]::new))
.build();
正如 Albjenow 所建议的,您可以先创建具有公共字段的构建器,然后在应用您的逻辑后构建最终请求。它看起来像:
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
.uri(URI.create("http://exampleURL.com/aFile"));
if (myFile.length() > 0) {
requestBuilder.header("Range","bytes="+myFile.length() +"-"+ totalBytes);
}
requestBuilder.header("xxxx","yyyyy");
HttpRequest request = requestBuilder.build();