본문 바로가기
Kotlin

[Spring Boot] RestTmplate로 외부 API 통신하기: GET

by 고체물리학 2022. 10. 26.

- header, parameter 아무것도 설정하지 않는 경우

fun getList(){
	val url = "http://localhost:3000/~~"        //외부 api 주소
	val restTemplate = RestTemplate()
	val response = restTemplate.getForObject<String>(
        url,
        String::class
    )
 	print(response)    
}

 

Error: I/O error on GET request for http://localhost:3000~~~~ 라는 에러가 뜬다

해결하기 위해서는 gradle에 HttpComponentsClientHttpRequestFactory라이브러리를 추가해준다

 

https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient

implementation("org.apache.httpcomponents:httpclient:4.5.13")

 

fun getList(){
	val httpRequestFactory: ClientHttpRequestFactory = HttpComponentsClientHttpRequestFactory()
	val url = "http://localhost:3000/~~"        //외부 api 주소
	val restTemplate = RestTemplate(httpRequestFactory)
	val response = restTemplate.getForObject<String>(
        url,
        String::class
    )
 	print(response)    
}

 

- parameter 추가

@GetMapping("/list")
fun getList(@RequestParam p: Long?){
        val httpRequestFactory: ClientHttpRequestFactory = HttpComponentsClientHttpRequestFactory()
        val uri: URI = UriComponentsBuilder
            .fromUriString("http://localhost:3000") //Base URL
            .path("/~~") 
            .queryParam("p", p) // query parameter가 필요한 경우 이와 같이 사용
            .encode()
            .build()
            .toUri()

        val restTemplate = RestTemplate(httpRequestFactory)
        val response = restTemplate.getForObject(
            uri,
            String::class.java
        )
 	print(response)    
}

 

getForObject대신 getForEntity 사용해도 됨

 

getForObject를 사용하면 객체로 결과를 받고

getForEntity는 ResponseEntity로 결과를 받기 때문에 getHeaders(), getBody()를 사용하여 필요한 정보를 받을 수 있다

반응형

 

- header 추가

@GetMapping("/list")
fun getList(@RequestParam p: Long?){
        val httpRequestFactory: ClientHttpRequestFactory = HttpComponentsClientHttpRequestFactory()
        val uri: URI = UriComponentsBuilder
            .fromUriString("http://localhost:3000") //Base URL
            .path("/~~") 
            .queryParam("p", p) // query parameter가 필요한 경우 이와 같이 사용
            .encode()
            .build()
            .toUri()

        val headers = HttpHeaders()
        headers.contentType = MediaType.APPLICATION_JSON
        headers.set("headername", value)
        val request = HttpEntity("",headers)

        val restTemplate = RestTemplate(httpRequestFactory)
        val response = restTemplate.exchange(uri, HttpMethod.GET, request, String::class.java)
 	print(response)    
}

 

 

response data 값 매핑

Dto를 만들어서 객체 형식으로 저장할 수 도 있고 key, value값으로 들고 올 수 있다

 

@GetMapping("/list")
fun getList(@RequestParam p: Long?){
        val httpRequestFactory: ClientHttpRequestFactory = HttpComponentsClientHttpRequestFactory()
        val uri: URI = UriComponentsBuilder
            .fromUriString("http://localhost:3000") //Base URL
            .path("/~~") 
            .queryParam("p", p) // query parameter가 필요한 경우 이와 같이 사용
            .encode()
            .build()
            .toUri()

        val headers = HttpHeaders()
        headers.contentType = MediaType.APPLICATION_JSON
        headers.set("headername", value)
        val request = HttpEntity("",headers)

        val restTemplate = RestTemplate(httpRequestFactory)
        val response = restTemplate.exchange(uri, HttpMethod.GET, request, String::class.java)
    	val gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
    	val map = gson.fromJson(response.body, Map::class.java)
        for (entry in map.entries) {
            println("${entry.key} = ${entry.value}")

        }
}

 

 

반응형

댓글