반응형
종종 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 을 커스터마이징하여 전송하니 성공할 수 있었음.
끝.
반응형
'공부 > 프로그래밍' 카테고리의 다른 글
Junit 5 Jupiter vs AssertJ 테스트하는데 어떤걸 쓰면 좋을까? (1) | 2025.02.28 |
---|---|
스프링 프레임워크 탄생 이야기 (0) | 2025.02.27 |
[Flutter] freezed와 toJson()의 관계: 왜 fromJson()이 필요할까? (0) | 2025.02.24 |
[springboot] jar파일과 json 파일을 각각 폴더에 위치하는 이유 (0) | 2025.02.21 |
개발자 관점에서 코드 AI 중 Cursor AI를 선택한 이유 (0) | 2025.02.18 |
댓글