반응형


요즘 만들고 있는 어플에 네이버 검색 API를 쓸 일이 있어 포스팅합니다.

네이버 오픈 API는 네이버 개발자 센터
http://dev.naver.com/openapI 로 가시면 상세한 설명을 보실 수 있습니다.

네이버 검색 API 중 지역 검색을 사용하는데요.
요청 URL(request url)요청변수(request parameter) target 값에 따라 검색 분야가 달라지네요.
지역 검색은 target값이 local입니다.
display는 받아올 결과의 수 입니다.

샘플 URL은 다음과 같습니다.
http://openapi.naver.com/search?key=test&query=%EA%B0%88%EB%B9%84%EC%A7%91&target=local&start=1&display=10

key에 자신이 받은 key값을 넣고 query에 검색할 키워드를 넣으시면됩니다.
검색어의 문자셋은 UTF-8을 써야한다고 하네요.
저는 일단 파싱만 하고 테스트만 할 목적이므로 샘플 URL에 key값만 넣어서 실행 했습니다.
샘플 URL의 검색어는 '갈비집'이네요.

출력결과로 다양한 값들이 있는데 저는 제게 필요한 것들만 받아옵니다.
우선 결과를 먼저 보여 드리면 이렇습니다.^^;; 허접하죠


결과로 주어지는 항목들은 네이버 개발자 센터에 테이블로 잘 정리가 되있습니다 ㅎㅎ
PullParser를 사용할건데요 뭐 속도가 느릴거라는 말도 있던데 어차피 전 테스트이므로 4개만 받아올거라서 크게 못 느낄 것 같아요.(그렇겠죠??????아닌가??)

package ksk06.naverapi;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class NaverTest extends Activity {
     
 /** Called when the activity is first created. */
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TextView status = (TextView)findViewById(R.id.status);
        TextView status1 = (TextView)findViewById(R.id.status1); //파싱된 결과를 보자
        TextView status2 = (TextView)findViewById(R.id.status2);
          
        boolean inItem = false, inTitle = false, inAddress = false, inMapx = false, inMapy = false;
       
  String title = null, address = null, mapx = null, mapy = null;
  String query = "%EA%B0%88%EB%B9%84%EC%A7%91"; //이부부은 검색어를 UTF-8로 넣어줄거임.
  System.out.println(query);
  
        try{
            URL url = new URL("http://openapi.naver.com/search?"
           +"key=여기에 발급받은 키값을 넣으세요"
           +"&query="+query //여기는 쿼리를 넣으세요(검색어)
           +"&target=local&start=1&display=4");
            
      
         XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
         XmlPullParser parser = parserCreator.newPullParser();
           
         parser.setInput(url.openStream(), null);
                  
         status.setText("파싱 중이에요..");
         
         int parserEvent = parser.getEventType();
         
         while (parserEvent != XmlPullParser.END_DOCUMENT){
          switch(parserEvent){                     
           case XmlPullParser.START_TAG:  //parser가 시작 태그를 만나면 실행
            if(parser.getName().equals("item")){
             inItem = true;
            }
            if(parser.getName().equals("title")){ //title 만나면 내용을 받을수 있게 하자 
             inTitle = true;              
            }
            if(parser.getName().equals("address")){ //address 만나면 내용을 받을수 있게 하자
            inAddress = true;              
            }
            if(parser.getName().equals("mapx")){ //mapx 만나면 내용을 받을수 있게 하자  
             inMapx = true;              
            }
            if(parser.getName().equals("mapy")){ //mapy 만나면 내용을 받을수 있게 하자  
             inMapy = true;              
            }            
            if(parser.getName().equals("message")){ //message 태그를 만나면 에러 출력
             status1.setText(status1.getText()+"에러");
              //여기에 에러코드에 따라 다른 메세지를 출력하도록 할 수 있다.
            }            
            break;
            
           case XmlPullParser.TEXT://parser가 내용에 접근했을때
            if(inTitle){ //isTitle이 true일 때 태그의 내용을 저장.
             title = parser.getText();             
                inTitle = false;
            }
            if(inAddress){ //isAddress이 true일 때 태그의 내용을 저장.
             address = parser.getText();             
                inAddress = false;
            }
            if(inMapx){ //isMapx이 true일 때 태그의 내용을 저장.
             mapx = parser.getText();             
                inMapx = false;
            }
            if(inMapy){ //isMapy이 true일 때 태그의 내용을 저장.
             mapy = parser.getText();             
                inMapy = false;
            }
            break;            
           case XmlPullParser.END_TAG:
            if(parser.getName().equals("item")){
             status1.setText(status1.getText()+"상호 : "+ title +"\n주소 : "+ address +"\n좌표 : " + mapx + ", " + mapy+"\n\n");
             inItem = false;
            }
            break;                   
          }          
           parserEvent = parser.next();
         }
         status2.setText("파싱 끝!");
        } catch(Exception e){
         status1.setText("에러가..났습니다...");
        }       
    }
}

레이아웃은 간단히 파싱되는걸 확인만 할거라서 텍스트뷰로 만들었습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
 android:id="@+id/status" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
    <TextView
 android:id="@+id/status1" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
    <TextView
 android:id="@+id/status2" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

절대로 빠뜨리시면 안될 한가지가 있습니다.
AndroidManifest.xml 파일에 인터넷에 접근하기 위한 권한을 설정해 주셔야합니다^^
<uses-permission android:name="android.permission.INTERNET"/>

저는 이렇게 간단히 검색어에 대한 건색 결과 중 상호와, 주소, map의 좌표를 받아 온 것을 String에 넣어서 출려해 봤습니다. 실제로 편리하게 쓰시려면 List 같은 걸 사용하시면 더 좋을 거 같아요.

네이버의 다른 오픈 검색 API 도 똑같은 URL을 사용하기 때문에 target값만 바꿔 주시고 받아올 결과들에 대한 코드만 수정해 주시면 다른 검색도 쉽게 사용하실 수 있을겁니다. 
반응형

+ Recent posts