programing

사용자 지정 http 헤더를 Spring RestTemplate 요청에 추가 / extend RestTemplate

powerit 2023. 10. 20. 14:51
반응형

사용자 지정 http 헤더를 Spring RestTemplate 요청에 추가 / extend RestTemplate

현재 코드:

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

요청할 때 사용자 지정 머리글을 추가해야 합니다. 형식은 다음과 같습니다.

X-TP-DeviceID : <GUID>

제 경우에 가장 간단한 방법은 무엇입니까?사용자 지정 머리글 정의를 내 머리글에 추가할 수 있는 방법이 있습니까?restTemplate서버로 요청을 보내기 전에 object?

[편집]

맞습니까?

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기본적으로 재고 헤더 대신 사용자 지정 헤더가 모두 표시됩니다.

RestTemplate 교환 방법으로 커스텀 http 헤더를 아래와 같이 전달할 수 있습니다.

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);

EDIT : 아래는 업데이트 된 코드입니다.이 링크에는 예제를 사용하여 휴게 서비스를 호출하는 여러 가지 방법이 있습니다.

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매개 변수는 a와 함께 사용할 수 있습니다.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이 있는지 없는지 확인하기 위해 작성한 방법입니다.요청 헤더를 추가해야 하는 요구사항이 있었습니다.그루비지만 자바에 적응하기에는 꽤 간단해야 합니다.기본적으로 제가 사용하고 있는 것은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 closure를 통과하고 있다는 것입니다(방법에 대한 세 번째 매개 변수).restTemplate.execute(), 어느 쪽이든, 대략적으로 말하면, 자바 월드의 람다)는 Spring이 명령을 실행하기 전에 요청 객체를 조작할 수 있도록 Spring API에 의해 콜백으로 실행되는 것입니다.

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
  }

언급URL : https://stackoverflow.com/questions/32623407/add-my-custom-http-header-to-spring-resttemplate-request-extend-resttemplate

반응형