728x90
프로젝트를 작업하다 보면, Open API를 사용해야하는 경우가 많다.
RestTemplate를 사용하여 간단하게 연동하는 법에 대해서 알아보겠다.
Naver 지역 검색 API 연동하는 법에 대해서 알아보겠다.
호출예시
// 네이버 검색 API 예제 - blog 검색
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
public class ApiExamSearchBlog {
public static void main(String[] args) {
String clientId = "YOUR_CLIENT_ID"; //애플리케이션 클라이언트 아이디값"
String clientSecret = "YOUR_CLIENT_SECRET"; //애플리케이션 클라이언트 시크릿값"
String text = null;
try {
text = URLEncoder.encode("그린팩토리", "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("검색어 인코딩 실패",e);
}
String apiURL = "https://openapi.naver.com/v1/search/blog?query=" + text; // json 결과
//String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text; // xml 결과
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", clientId);
requestHeaders.put("X-Naver-Client-Secret", clientSecret);
String responseBody = get(apiURL,requestHeaders);
System.out.println(responseBody);
}
private static String get(String apiUrl, Map<String, String> requestHeaders){
HttpURLConnection con = connect(apiUrl);
try {
con.setRequestMethod("GET");
for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
con.setRequestProperty(header.getKey(), header.getValue());
}
int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 호출
return readBody(con.getInputStream());
} else { // 에러 발생
return readBody(con.getErrorStream());
}
} catch (IOException e) {
throw new RuntimeException("API 요청과 응답 실패", e);
} finally {
con.disconnect();
}
}
private static HttpURLConnection connect(String apiUrl){
try {
URL url = new URL(apiUrl);
return (HttpURLConnection)url.openConnection();
} catch (MalformedURLException e) {
throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
} catch (IOException e) {
throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
}
}
private static String readBody(InputStream body){
InputStreamReader streamReader = new InputStreamReader(body);
try (BufferedReader lineReader = new BufferedReader(streamReader)) {
StringBuilder responseBody = new StringBuilder();
String line;
while ((line = lineReader.readLine()) != null) {
responseBody.append(line);
}
return responseBody.toString();
} catch (IOException e) {
throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
}
}
}
1. 오픈 API 이용 신청
2. Documents > 서비스API : API 사용법 확인하기
- 애플리케이션 등록: 네이버 오픈 API로 개발하시려면 먼저 'Application-애플리케이션 등록' 메뉴에서 애플리케이션을 등록하셔야 합니다.
- 클라이언트 ID와 secret 확인: '내 애플리케이션'에서 등록한 애플리케이션을 선택하면 Client ID와 Client Secret 값을 확인할 수 있습니다.
- API 권한 설정: '내 애플리케이션'의 'API 권한관리' 탭에서 사용하려는 API가 체크되어 있는지 확인합니다. 체크되어 있지 않을 경우 403 에러(API 권한 없음)가 발생하니 주의하시기 바랍니다.
호출
curl "https://openapi.naver.com/v1/search/local.xml?query=%EC%A3%BC%EC%8B%9D&display=10&start=1&sort=random" \
-H "X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 client id 값}" \
-H "X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 client secret 값}" -v
Header 에 X-Naver-client-id , -X-Naver-Client-Secret가 필요함
json => local.json
요청
> GET /v1/search/local.xml?query=%EC%A3%BC%EC%8B%9D&display=10&start=1&sort=random HTTP/1.1
> Host: openapi.naver.com
> User-Agent: curl/7.49.1
> Accept: */*
> X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 client id 값}
> X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 client secret 값}
결과
{
"lastBuildDate": "Sun, 26 Jun 2022 10:39:52 +0900",
"total": 5,
"start": 1,
"display": 5,
"items":[
{"title": "유안타<b>증권</b>", "link": "http://www.myasset.com/",…},
{"title": "도이치<b>증권</b>", "link": "", "category": "금융,보험>투자기관", "description": "",…},
{"title": "<b>주식</b>투자의신", "link": "https://multistock.modoo.at",…},
{"title": "여의도<b>주식</b>투자연구소", "link": "http://www.yeouido-stock.com/",…},
{"title": "키움<b>증권</b>", "link": "http://www.kiwoom.com/",…}
]
}
RestTemplate 사용
@GetMapping("/naver")
public String naver(){
// utf-8 URiComponetsBuilder에서 encode하면된다.
URI uri = UriComponentsBuilder
.fromUriString("https://openapi.naver.com")
.path("/v1/search/local.json")
.queryParam("query","투썸플레이스")
.queryParam("display",10)
.queryParam("start",1)
.queryParam("sort", "random")
.encode(Charset.forName("UTF-8"))
.build()
.toUri();
RestTemplate restTemplate = new RestTemplate();
//Header를 사용
RequestEntity<Void> req = RequestEntity
.get(uri)
.header("X-Naver-Client-Id", "?")
.header("X-Naver-Client-Secret" , "?")
.build();
ResponseEntity<String> result = restTemplate.exchange(req,String.class);
return result.getBody();
}
Reference
728x90
'Backend > Spring & SpringBoot' 카테고리의 다른 글
RestTemplate 사용법 (1) - getForObject(), getForEntity() (0) | 2022.06.26 |
---|---|
[스프링 인 액션 5장] Spring 자동구성, Logback 활용 (1) | 2022.06.05 |
[스프링 인 액션 3장] Spring JDBC 사용 (0) | 2022.05.22 |
Spring Boot Test하기 [1] (0) | 2022.05.08 |
Hypermedia-Driven RESTful Web Services : Spring HATEOAS 구현방법 [2] (0) | 2022.04.18 |