[Java]네이버 블로그 검색 API 적용 및 예제
1. 네이버 블로그 검색 API란?
우리가 서비스를 만들다 보면 어떤 검색어에 대해 관련된 네이버 블로그들을 가져오고 싶을 때가 있다.
아래는 이 API를 사용하여 만들 수 있는 서비스인데 현재도 서비스 중인 모 사이트에서 예시를 가져와 보았다.
이번에 포스팅 할 네이버 블로그 검색 API는
위 이미지와 같은 서비스를 만들어야 하는 상황에 사용하면 좋은 API라고 보면 된다.
하루에 네이버의 타 검색 API요청 횟수 다 합쳐서 25000회까지 요청이 가능하다.
2. 오픈 API 신청하기
처음 네이버 API를 이용하려 하는 것이라면 자신의 서비스를 등록해줘야 한다.
아래 주소로 가서 자신의 서비스를 등록하고 오도록 하자.
https://developers.naver.com/apps/#/register?defaultScope=translate
아래는 등록할 때 화면이다.
네이버 API 등록 화면
사용 API항목에서 검색을 누르고 환경을 자신의 서비스에 맞게 Web/Android/IOS 중에 고르면 된다.
등록 후 화면
애플리케이션 등록이 끝났다면 다음과 같은 화면이 나오게 되는데 여기서 ClientId와 Client Secret 키들을 복사 해놓도록 하자.
3. API 연동 코드 제작
프로젝트 내에 번역할 문장을 보내고 받아올 기능을 할 클래스를 제작하고
아래의 코드들을 넣는다.
참고로 아래는 SpringBoot기반으로 작성된 소스코드이니
본인의 상황에 맞게 바꿔서 쓰면 될 것 같다.
3.1 search 함수 제작
public void search(String searchWord) {
String text = null;
try {
text = URLEncoder.encode(searchWord, "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", "네이버 키 값");
requestHeaders.put("X-Naver-Client-Secret", "네이버 시크릿 값");
String responseBody = get(apiURL,requestHeaders);
System.out.Println(responseBody);
}
먼저 getTransSentence함수에서 매개변수로 검색할 키워드를 받아온다.
여기서 해당 문장을 URLEncoding을 한번 하고 text에 세팅을 해준다.
그리고 요청할 requestHeader에다 네이버에서 복사했던 아이디와 시크릿 키를 세팅해준다.
이후 post 함수를 만들어 두고 post함수를 요청해서 응답을 네이버에게서 받아오고
받은 결과(responseBody)를 원하는 대로 가공해서 쓰면 된다.
여기서 URL에 파라미터를 넣어 검색 결과를 원하는 대로 조정할 수 있는데
아래 이미지를 참고하여 본인이 원하는 대로 조정하길 바란다.
3.2. 요청을 보내고 받아올 get, connect 함수 제작.
private 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 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);
}
}
get함수와 connect 함수에서는 GET방식으로 요청을 보내서 결과를 받아오는 역할을 한다.
HttpURLConnection을 생성해서 POST방식으로 요청을 보내고
그 결과가 response코드가 200(정상)인지 체크해서 정상 반환해준다.
3.3 요청받은 Body를 읽는 readBody함수를 제작
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);
}
}
get함수에서 받은 결과 값을 리턴해주는 함수인 readBody를 제작한다.
받은 값을 UTF8로 읽어서 BufferedReader로 값들을 읽어서 리턴해준다.
이렇게 하면 결과 값을 읽어서 네이버에서 받은 요청 번역된 문장을
최종적으로 String형태로 search함수에서 받아올 수 있다.
이 결과값을 gson등의 라이브러리를 통해
객체에 매핑하거나 하는 방법으로 데이터를 가져다 쓰면 된다.
아래 내용은 전체 소스코드이다.
필요하신 분은 가져다 쓰시면 될 것 같다.
public void search(String searchWord) {
String text = null;
try {
text = URLEncoder.encode(searchWord, "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", CommonConstants.CLIENT_SUB_ID);
requestHeaders.put("X-Naver-Client-Secret", CommonConstants.CLIENT_SUB_SECRET);
String responseBody = get(apiURL,requestHeaders);
System.out.println(responseBody);
}
private 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 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);
}
}
'Language > Java' 카테고리의 다른 글
[JAVA] 정규표현식 개념과 예제(회원가입, 결제, 본인인증 입력값 검사기 예제) (0) | 2021.02.06 |
---|---|
[Java]SHA256 암호화(Encrypt) 정리 및 예제 (0) | 2020.09.10 |
[Java]생성자와 소멸자, this키워드 개념 정리 및 예제 (0) | 2020.09.07 |
[Java]객체와 메모리의 관계, null과 NullPointerException의 정리 및 예제 (0) | 2020.09.06 |
[Java]접근제어자(Access Modifier) 개념 정리 (0) | 2020.08.26 |