it-roy-ru.com

Добавить мой настраиваемый заголовок 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();

[Добавлено]

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

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

16
user1209216

Вы можете передать пользовательские заголовки 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();
22
kswaughs

Добавьте заголовок «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());
0
Sean Gildea