반응형
요즘 만들고 있는 어플에 네이버 검색 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 org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
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("에러가..났습니다...");
}
}
}
/** 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>
<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값만 바꿔 주시고 받아올 결과들에 대한 코드만 수정해 주시면 다른 검색도 쉽게 사용하실 수 있을겁니다.
반응형
'컴퓨터&IT > 안드로이드 Android' 카테고리의 다른 글
네이버 검색 API 에서 한글 검색을 위한 인코딩 (UTF-8) (2) | 2011.11.01 |
---|---|
다음 지도API 사용하여 서로 다른 좌표계 변환하기 (ex. KTM 에서 GWS) (6) | 2011.10.31 |
Android - XML 파일 파싱하기 (0) | 2011.08.24 |
Android - HttpURLConnection 클래스 (0) | 2011.08.24 |
Android - HTTP로 웹에 접근하기!! (0) | 2011.08.24 |