RestTemplate

 

Spring 3.0 이상에서 제공하는 http 통신을 위한 템플릿으로 Rest Api 호출 후 응답까지 기다리는 동기식 클라이언트

 

 


 

 

Spring Boot의 Java Sub Module에서 Kakao Local Api 호출이 필요하여 구현한 간단한 예제입니다.

 

 

예제에서 사용할 것

  • RestTemplate
  • HttpHeaders
  • UriComponentsBuilder
  • HttpEntity

 

 

	String uri;
        RestTemplate restTemplate = new RestTemplate();

        // 카카오 Api Key를 헤더에 셋팅합니다.
        final HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", REST_API_KEY);

        // 파라미터 설정
        // query 파라미터는 인코딩 이슈로 이후에 추가
        UriComponentsBuilder builder = null;
        builder = UriComponentsBuilder
				.fromHttpUrl(REST_API_URL)
		        .queryParam("page", 5)
		        .queryParam("size", 15)
		        .queryParam("sort", "accuracy")
		        .queryParam("category_group_code", "FD6")
		        .queryParam("x", xLng)
		        .queryParam("y", yLat)
		        .queryParam("radius", "500");
        
        // 헤더를 넣은 HttpEntity 생성
        final HttpEntity<String> entity = new HttpEntity<String>(headers);

 

Set Header, Parameters, Entity

카카오 개발 가이드 를 참고했습니다.

 

 

	ParameterizedTypeReference<Map<String, Object>> typeRef = 
				new ParameterizedTypeReference<Map<String, Object>>() {};

 

  •   ParameterizedTypeReference 

Object와 같은 Generic Type을 Response 받기 위해 사용

타입소거(Type Erasure)되지 않기 위해 사용하는 Super Type Token 이라고 한다.

Super Type Token은 자바 컴파일 시 소거되지 않는 제네릭 정보 ..라고 하는데

지금 당장 POJO로 받기 귀찮아서 Map으로 받았는데.. 그냥 처음부터 POJO로 받을 걸 그랬나 싶다.

추후에 POJO로 변경 할 예정

 

 

        // 한글 
        uri = builder.encode().toUriString() + "&query=" + query;
        
        ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
        		uri,
				HttpMethod.GET,
				entity,
				typeRef);

 

  • exchange(RequestEntity<?> requestEntity, Class<T> responseType)

Execute the request specified in the given RequestEntity and return the response as ResponseEntity.

 -> Http Method를 지정해서 요청 후 RequestEntity로 반환

 

위 출처는 스프링 개발문서 입니다. 

 

 

URI로 Encode를 하면, query key 로 전달되어야하는 "맛집" 이라는 value 값이 변환되어 kakao api에서 인식하지 못했다.

그래서 부득이하게 파라미터들을 uri로 인코딩한 후 한글 값을 따로 추가하여 request 했습니다.

 

 

 

  • Test Code
	ResponseEntity<Map<String, Object>> responseEntity = searchKeywordService.callKaKaoLocalApi(xLng, yLng, "맛집");
        log.info(responseEntity.getStatusCode().toString());
        log.info(responseEntity.getBody().get("documents").toString());

 

참고로 위도 경도는 프론트에서 Geolocation API를 사용하여 받았습니다.

e-una.tistory.com/7

 

 

  • 200 OK ~~~

 

복사했습니다!