Как добавить заголовки на основе нескольких условий для HttpRequest Java 11? - PullRequest
2 голосов
/ 11 октября 2019

Я изучаю 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

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Как предположил Альбьенов, вы можете сначала создать компоновщик с общими полями, а затем сформировать окончательный запрос после применения вашей логики. Это будет выглядеть так:

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();
1 голос
/ 11 октября 2019

Альтернативным способом может быть определение всех возможных заголовков перед завершением цепочки build для HttpRequest и использование их с 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();
...