Отправить настраиваемые заголовки RestTemplate

Я пытаюсь установить собственный заголовок для своих запросов RestTemplate. Я использую Spring Boot 2.0.6.RELEASE

Я пытаюсь установить их так, внутри моего общедоступного метода

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("muh Header", "muh value");

Каждый раз, когда я пытаюсь это сделать, возникает следующая ошибка

'HttpHeaders(java.util.Map<java.lang.String,java.util.List<java.lang.String>>)' has private access in 'java.net.http.

Я понимаю, что сообщение об ошибке означает, что я пытаюсь создать экземпляр частного класса вне класса, в котором объявлен частный класс.

Итак, каков наилучший курс действий?

задается аналогичный вопрос stackoverflow.com/questions/45152484/…, однако я проверил и выяснил, что они используют тот же подход, что и вы.

Amit Kumar Lal 24.10.2018 04:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 303
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете создать перехватчик, который перехватывает все запросы, отправленные остальным шаблоном, и добавлять настраиваемые заголовки следующим образом:

public class TokenAuthorizationInterceptor implements ClientHttpRequestInterceptor {
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
            throws IOException {
        request.getHeaders().add("ContentType", MediaType.APPLICATION_JSON);
        request.getHeaders().add("muh Header", "muh value");
        return execution.execute(request, body);
    }

}

this.restTemplate = new RestTemplate();
this.restTemplate.getInterceptors().add(new TokenAuthorizationInterceptor());

Это будет работать нормально, если вы хотите добавить одинаковые пользовательские заголовки ко всем вашим запросам, отправляемым через этот шаблон отдыха. Одним из преимуществ этого подхода является то, что вы можете устанавливать собственные HTTP-заголовки только в одном месте, а не делать это везде, где вы отправляете запрос.

Ответ принят как подходящий

Я бы сказал что-то вроде этого:

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class WebController {
    private static final String template = "Hello, %s!";

    @RequestMapping("/greeting")
    public ResponseEntity<String> greeting(@RequestParam(value = "name", defaultValue = "World") String name){
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("thisiskey", "this is value");
        return new ResponseEntity<>(name, headers, HttpStatus.ACCEPTED);
    }
}

Надо задуматься:

  1. Как часто вы хотите добавлять собственный заголовок и как часто они меняются? Если это применимо только к одному или двум, вы можете рассмотреть этот вариант, однако, если он более чем в два раза, я бы предложил использовать http-перехватчик.

  2. header.add ("", "") ->, который реализует MultiValueMap, не принимает header.add ("mua key", "...") ->, поскольку в ключе есть пробел.

Пакет, который вы используете, неправильный, чтобы добавить заголовки при использовании Spring restTemplate, вы должны использовать org.springframework.http.HttpHeaders.HttpHeaders вместо java.net.http.HttpHeaders, последний - это то, что вы пытаетесь использовать.

Вот фрагмент кода, который добавляет заголовки запроса.

// request resource
HttpHeaders headers = new HttpHeaders();
headers.set("headerName", "headerValue");

HttpEntity entity = new HttpEntity(headers);

ResponseEntity<String> response = restTemplate.exchange("some url", HttpMethod.GET, entity, String.class);

Это тоже было проблемой, очень раздражало, ха.

Paul McLoughlin 24.10.2018 05:54

Другие вопросы по теме