본문 바로가기
공부/프로그래밍

[JAVA] GET에다가 body 값 보내기(비표준 연동, RestTemplate)

by demonic_ 2025. 2. 27.
반응형

종종 HTTP 규격에 어긋난 형태의 API를 보게되는데, 외부 연동을 RestTemplate 로 간단하게 하는 상황에서 이런경우를 겪는다면 당황스럽다. 그래도 외부 서버다보니 내가 수정할 수 없어 해결을 해야하는 상황이 오는데, 이번에도 비슷한 상황이었다.

 

 

curl 로 전송할때 이런 상황인데

curl -k 
  -X GET 
  -d '{"sdt":"2025-02-05","edt":"2025-02- 15","list":[{"id":"00217"},{"id":"00005"}]}' 
  -H 'Content-Type: application/json' 
  -H 'Authorization: server-key-auth' 
  http://test.co.kr/manage/history
 
본문 데이터에서 -d로 JSON 데이터를 전달. 하지만 HTTP 표준에서 GET 요청은 본문을 지원하지 않으므로 다른 방법으로 전송해야 한다. 문제는 RestTemplate은 GET 요청에 본문을 붙이는 것을 기본적으로 지원하지 않으므로, 다른방식으로 구현이 필요하다.
 
인터넷이나 GPT에 물어보면 RestTemplate requestEntity에 넣어서 전송하는 샘플을 보여주는데 다 실패했다. 파라미터 값이 제대로 전송되지 않는 것.
 
그래서 좀더 찾아보니 HttpClient 를 직접 사용하는 방법으로 가능했다.

아래는 사용법이다.

CloseableHttpClient client = HttpClients.createDefault();

HttpGet httpGet = new HttpGet("http://test.co.kr/manage/history");
httpGet.setHeader("Content-Type", "application/json");
httpGet.setHeader("Authorization", "service-key-auth");
String json = objectMapper.writeValueAsString(request);
httpGet.setEntity(new StringEntity(json));

CloseableHttpResponse response = client.execute(httpGet);
String responseBody = EntityUtils.toString(response.getEntity());
 

 

이렇게 하니 데이터값이 제대로 전달이 되었고 Response를 잘 받을 수 있었다.

 

 

 

정리하자면 

- GET 에다가 Body를 넣는것은 비표준이다.

- RestTemplate 에서는 해결할 수 없었다.

- HttpClient 을 커스터마이징하여 전송하니 성공할 수 있었음.

 

 

 

끝.

반응형

댓글