【问题标题】:How to add headers based on multiple conditions to HttpRequest Java 11?如何将基于多个条件的标头添加到 HttpRequest Java 11?
【发布时间】:2019-10-11 10:11:39
【问题描述】:

我正在学习java.net.http api,试图下载一个给定已下载字节范围的文件。为此,可以使用range 标头(假设服务器支持此类功能)。

使用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 我无法动态添加新标头,我必须创建一个新的整个 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

我有办法动态添加它们吗?

我看到文档说:

HttpRequest 构建后是不可变的,可以多次发送。

但是不可变的意义何在?如果我出于任何原因需要修改标头怎么办?

参考:

https://openjdk.java.net/groups/net/httpclient/intro.html

【问题讨论】:

  • 您可以存储HttpRequest.Builder 实例并分别调用各种方法,而不是链接方法。仅在发送请求之前致电build
  • @Albjenow 哦...:/ 没有意识到这一点。谢谢

标签: java http-headers httprequest java-11 java-http-client


【解决方案1】:

正如 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();

【讨论】:

    【解决方案2】:

    另一种方法是在完成HttpRequestbuild 链之前确定所有可能的标头,并将它们与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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-08
      • 2015-05-19
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      相关资源
      最近更新 更多