Добавить мой собственный HTTP-заголовок в Spring RestTemplate запрос / расширить RestTemplate

Мой текущий код:

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Mall[] malls = restTemplate.getForObject(url, Mall[].class);

Мне нужно добавить несколько пользовательских заголовков для моего запроса в форме:

X-TP-DeviceID : <GUID>

Какой самый простой способ сделать это в моем случае? Есть ли способ добавить определение пользовательских хадеров в мой объект restTemplate перед отправкой запроса на сервер?

[править] Это правильно?

 RestTemplate restTemplate = new RestTemplate();
                restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

                HttpHeaders headers = new HttpHeaders();
                headers.set("X-TP-DeviceID", "1234567890");
                HttpEntity entity = new HttpEntity(headers);

                HttpEntity<Mall[]> response = restTemplate.exchange(url, HttpMethod.GET, entity, Mall[].class);

                Mall[] malls = response.getBody();

[добавлено] Итак, мне удалось, чтобы это работало. Однако я не полностью удовлетворен этим. В моем случае мне потребуется предоставить одинаковые пользовательские заголовки для всех моих звонков.

Итак, мой следующий вопрос - возможно ли настроить автоматическое добавление моих пользовательских заголовков при каждом вызове websesrvice? Например, расширением класса RestTemplate и размещением там всех пользовательских заголовков. Таким образом, все, что мне тогда нужно, - это просто использовать мой собственный расширенный RestTemplate вместо стандартного, и все мои пользовательские заголовки будут присутствовать там по умолчанию.

4 ответа

Вы можете передать пользовательские заголовки http методом обмена RestTemplate, как показано ниже.

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(new MediaType[] { MediaType.APPLICATION_JSON }));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-TP-DeviceID", "your value");

HttpEntity<RestRequest> entityReq = new HttpEntity<RestRequest>(request, headers);

RestTemplate template = new RestTemplate();

ResponseEntity<RestResponse> respEntity = template
    .exchange("RestSvcUrl", HttpMethod.POST, entityReq, RestResponse.class);

РЕДАКТИРОВАТЬ: Ниже обновленный код. Эта ссылка имеет несколько способов вызова службы отдыха с примерами

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-TP-DeviceID", "your value");

HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

ResponseEntity<Mall[]> respEntity = restTemplate.exchange(url, HttpMethod.POST, entity, Mall[].class);

Mall[] resp = respEntity.getBody();

Если цель состоит в том, чтобы иметь повторно используемый RestTemplate, который, как правило, полезен для присоединения того же заголовка к серии аналогичных запросов, org.springframework.boot.web.client.RestTemplateCustomizer параметр можно использовать с RestTemplateBuilder:

 String accessToken= "<the oauth 2 token>";
 RestTemplate restTemplate = new RestTemplateBuilder(rt-> rt.getInterceptors().add((request, body, execution) -> {
        request.getHeaders().add("Authorization", "Bearer "+accessToken);
        return execution.execute(request, body);
    })).build();

Добавьте заголовок "User-Agent" к вашему запросу.

Некоторые серверы пытаются заблокировать доступ к своему серверу программ-пауков и скребков, поскольку в более ранние дни запросы не отправляли заголовок пользовательского агента.

Вы можете либо попытаться установить пользовательское значение пользовательского агента, либо использовать какое-либо значение, которое идентифицирует браузер, например "Mozilla/5.0 Firefox/26.0".

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();

    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.add("user-agent", "Mozilla/5.0 Firefox/26.0");
    headers.set("user-key", "your-password-123"); // optional - in case you auth in headers
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
    ResponseEntity<Game[]> respEntity = restTemplate.exchange(url, HttpMethod.GET, entity, Game[].class);

    logger.info(respEntity.toString());

Вот метод, который я написал, чтобы проверить, существует ли URL-адрес или нет. У меня было требование добавить заголовок запроса. Это Groovy, но его достаточно просто адаптировать к Java. По сути, я использую org.springframework.web.client.RestTemplate#execute(java.lang.String, org.springframework.http.HttpMethod, org.springframework.web.client.RequestCallback, org.springframework.web.client.ResponseExtractor<T>, java.lang.Object...)Метод API. Я предполагаю, что решение, к которому вы придете, зависит, по крайней мере, частично от метода HTTP, который вы хотите выполнить. Ключевым выводом из приведенного ниже примера является то, что я передаю замыкание Groovy (третий параметр метода restTemplate.execute(), который более или менее грубо говоря Lambda в мире Java), который выполняется Spring API в качестве обратного вызова, чтобы иметь возможность манипулировать объектом запроса до того, как Spring выполнит команду,

      boolean isUrlExists(String url) {
    try {
      return (restTemplate.execute(url, HttpMethod.HEAD,
              { ClientHttpRequest request -> request.headers.add('header-name', 'header-value') },
              { ClientHttpResponse response -> response.headers }) as HttpHeaders)?.get('some-response-header-name')?.contains('some-response-header-value')
    } catch (Exception e) {
      log.warn("Problem checking if $url exists", e)
    }
    false
  }
Другие вопросы по тегам