최근 구글의 firebase 실시간 데이터베이스에 흥미가 생겼기 때문에 이것 저것 해보는 중인데, 그 중에서도 Rest API를 python에서 다루는 것을 실험해보기 위해 python firebase 라이브러리를 설치하게 되었다. 


firebase 공식 사이트에서는 아래 두 python 라이브러리를 소개하고 있다.

1. https://github.com/mikexstudios/python-firebase

2. http://ozgur.github.io/python-firebase/


pip를 지원하기 때문에 아래 명령어를 통해 설치를 하고 IDE인 pycharm을 켜고 프로젝트를 만들었다. 


pip install -e git://github.com/mikexstudios/python-firebase.git#egg=python-firebase


그런데 "from firebase import firebase"가 인식이 안되는 현상이 발생했다.

왜그런가 확인을 하다보니 compile하는 python의 버전이 아까 터미널에서 확인한 버전과 다른 것이 확인이 되었다.


데이터 분석을 공부해보기 위해 Canopy 를 설치하다보니 python버전이 2.6/2,7 두 개가 설치 되어 있었다보니 pip로 설치를 하면 default로 설정되어 있는

Canopy 설치 시에 깔려 있던 2.7.11버전에 라이브러리가 설치되어 있었는데, pycharm에는 2.6.9버전이 컴파일하다보니 라이브러리가 없는 것으로 인식된 것이다.


그래서 버전이 다른 python에  pip로 설치하는 방법을 찾아봤는데 제대로 된 답을 얻을 수가 없었다.

결국 github에 있는 소스를 다운 받은 다음 python setup.py install를 통해 직접 설치하여 해결 할 수가 있었다.


혹시라도 삽질하는 사람 있으면 그냥 직접 설치하시는 방법을 권장한다.

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) {


}
});




}
});



네이버 오픈 API를 통해서 지역 검색 결과를 불러오는 기능을 구현하려고 했다.


우선 생각해 볼 것이 API를 Call하는 것인데 안드로이드에 있는 기능을 순수하게 사용해서 불러오는 방법보다는 쉽게 쓸수 있는 라이브러리를 쓰기로 결심하고이것저것 찾아봤다. 


그 중에서 이번에 활용한 라이브러리는 Asynchronous Http Client for Android


깃허브: https://github.com/loopj/android-async-http

홈페이지: http://loopj.com/android-async-http/


무엇보다 간단한 사용법 때문에 사용하게 되었는데 다음과 같다.

AsyncHttpClient client = new AsyncHttpClient();

client.get("{URL}" , 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