GET 방식으로 Request 할 때 브라우져에 그냥 Request주소를 치면 결과값이 잘 리턴되는데, 코드로 Request하면 안되는 경우를 발견하고 고생했던 적이 있다.

몇일 간 사투 끝에 알아낸 것이 한글로 된 Query 를 직접 주소에 넣어보내면 제대로 된 URI로 인식하지 못하기 때문에 한글을 UTF-8로 변경해줘야 했던 것이었는데 브라우져는 그 부분을 그냥 자동으로 알아서 인코딩해서 Request하기 때문에 문제 없이 결과값을 받아냈던 것이었다.


어찌보면 너무나 당연한 것인데 문제를 겪는 당시에는 전혀 예상을 못한 문제라 크게 낭패를 봤던 기억이 난다.


암튼 네이버 오픈 API를 사용하기 위해서는 GET방식의 Request를 해야 한다.


네이버 오픈 API 지역 검색 : https://developers.naver.com/docs/search/local 


예를 들어 네이버 오픈 API의 경우 "https://openapi.naver.com/v1/search/local.xml"주소를 호출하는데 특정 Query를 호출하게 되면 다음과 같은 주소를 요청하게 된다. 물론 인증을 위해 헤더에 클라이언트 키값과 시크릿코드를 넣긴해야 작동하기 때문에 아래 주소를 바로 넣으면 인증되지 않은 요청이라는 결과값이 뜰것이다.


https://openapi.naver.com/v1/search/local.xml?query=서울


그럼에도 불구하고 "서울"이란 단어를 바로 사용할 경우 제대로 된 응답을 얻을 수 없게 된다.


이 경우에는 "서울"을 UTF-8로 인코딩을 해야 한다.


안드로이드에서는 URLEncoder라는 기능을 제공한다. 이전 포스트에서 [네이버 오픈 API] 안드로이드에서 Get Request 하기 (Feat. Asynchronous Http Client for Android)  사용했던 라이브러리를 쓰면 다음과 같이 방식으로 검색결과를 호출할 수 있다.


search_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

String query = query_input.getText().toString();

try {

convertQuery = URLEncoder.encode(query, "utf-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}


final String defaultUrl = "https://openapi.naver.com/v1/search/local.xml?query=";

AsyncHttpClient client = new AsyncHttpClient();

client.addHeader("Content-Type", "application/xml");
client.addHeader("X-Naver-Client-Id", "{클라이언트키}");
client.addHeader("X-Naver-Client-Secret","{시크릿키}");
client.get(defaultUrl + convertQuery , new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {


}

@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {


}
});




}
});



+ Recent posts