programing

RestTemplate를 사용한 헤더를 사용한HTTP get

jooyons 2023. 3. 31. 22:02
반응형

RestTemplate를 사용한 헤더를 사용한HTTP get

Spring Rest Template를 사용하여 GET 요청을 전송하려면 어떻게 해야 합니까?다른 질문에서는 POST를 사용하고 있습니다만, GET를 사용할 필요가 있습니다.이 작업을 실행하면 프로그램은 계속 작동하지만, 이 작업이 비동기 태스크에 있기 때문에 네트워크가 막힌 것 같습니다.또, 이 작업의 버튼을 클릭한 후에 다른 비동기 태스크를 실행하려고 하면, 동작하지 않습니다.

하려고 했는데

String url = "https://api.blah.com/2.0/search/cubes?w=jdfkl&whitespace=1";

MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("Bearer", accessToken);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //copied this from somewhere else, not sure what its for

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

HttpMessageConverter<String> stringConverter = new StringHttpMessageConverter();
FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
List<HttpMessageConverter<?>> msgConverters = new ArrayList<HttpMessageConverter<?>>();


msgConverters.add(formConverter);
msgConverters.add(new MappingJacksonHttpMessageConverter());
msgConverters.add(stringConverter); 

template.setMessageConverters(msgConverters);
//SetSearchResponseData is my custom class to store the incoming JSON
ResponseEntity<SetSearchResponseData> result = template.exchange(url, HttpMethod.GET, request, SetSearchResponseData.class);
//If I was using post, i could have done SetSearchResponseDataresponse = restTemplate.postForObject(url, request, SetSearchResponseData.class);

RestTemplategetForObject()메서드는 헤더 설정을 지원하지 않습니다.해결책은 이 방법을 사용하는 것입니다.

그래서 대신restTemplate.getForObject(url, String.class, param)(헤더가 없습니다), 사용

HttpHeaders headers = new HttpHeaders();
headers.set("Header", "value");
headers.set("Other-Header", "othervalue");
...

HttpEntity<Void> requestEntity = new HttpEntity<>(headers);

ResponseEntity<String> response = restTemplate.exchange(
    url, HttpMethod.GET, requestEntity, String.class, param);

마지막으로 사용response.getBody()결과를 얻을 수 있습니다.

이 질문은 이 질문과 비슷합니다.

JavaDoc for RestTemplate를 참조하십시오.

HTTP GET에 대응하는 메서드가 있습니다.postForObject단, 어느 콜에도 헤더를 지정할 수 없기 때문에, 「GET with headers」요건을 만족시키지 않는 것 같습니다.

JavaDoc을 보면 HTTP GET 고유의 메서드는 헤더 정보를 제공할 수 없습니다.하지만 다른 대안이 있습니다. 그 중 하나를 찾아서 사용하고 있습니다.exchangemethods를 사용하여HttpEntity요청 세부사항을 나타내는 객체(헤더 포함)executemethods를 사용하여RequestCallback호출 시 헤더를 추가할 수 있습니다.

RestTemplate의 getForObject() 메서드는 헤더 설정을 지원하지 않습니다.이것을 사용할 수 있다

syntax:

restTemplate.exchange(url 엔드포인트, HttpMethod).GET, 엔티티, 파라미터)

public List<Employee> getListofEmployee()
 {
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>(headers);
    ResponseEntity<List<Employee>> response = restTemplate.exchange("http://hello-server/rest/employees",
    HttpMethod.GET,entity, new ParameterizedTypeReference<List<Employee>>() {});
    return response.getBody(); //this returns List of Employee 
  }

언급URL : https://stackoverflow.com/questions/16781680/http-get-with-headers-using-resttemplate

반응형