관리 메뉴

드럼치는 프로그래머

[안드로이드] 인터넷 연결 (HttpComponents) 본문

★─Programing/☆─Android

[안드로이드] 인터넷 연결 (HttpComponents)

드럼치는한동이 2011. 11. 4. 16:00

안드로이드가 탑재되는 대부분의 기기는

3G 혹은 와이파이 등으로 인터넷 연결이 가능합니다.


그래서 안드로이드는 개발자가 다양한 방법으로 

인터넷을 사용 할 수 있도록 기능을 제공합니다.


안드로이드 내부에는 SOAP 나 XML-RPC 클라이언트 API 가 포함되어 있지는 않지만

대신 아파치 HttpComponents 라이브러리를 내장하고 있습니다.

HttpComponents 에 관한 문서는 다음 링크에서 보다 자세하게 확인 가능합니다.

http://hc.apache.org/


HttpComponents 패키지 가운데 HttpClient 컴포넌트는 

모든 종류의 HTTP 요청을 처리 가능합니다.


HTTP 요청에 대한 결과는 HttpRequest 클래스에 보관되는데 

HTTP 요청 종류에 따라 HttpRequest 를 상속받은 각자의 클래스가 정의되어 있습니다.


예를 들어 HttpGet 클래스는 get 요청에 대한 클래스이고,

HttpPost 클래스는 post 요청에 관한 것입니다.


글로만 적으면 이해가 어려우므로 예제를 하나 해보겠습니다.

요새는 대부분의 사이트가 OpenAPI 를 제공하고 또 http 요청으로 이루어지므로

OpenAPI 를 연동하는 예제를 해보겠습니다.


여기서는 네이버 OpenAPI 를 이용해 네이버 실시간 검색 순위를 보는 예제를 해보죠.


네이버 OpenAPI 를 사용하기 위해서는 

네이버 개발자 센터에서 키를 등록해야 합니다.


개발자 센터에 들어간 뒤 OpenAPI 탭에서 키등록 카테고리를 들어갑니다.





키 등록이 끝나면 아래에 테스트 URL 이 있습니다.

거기서 실시간 검색어 테스트를 했을 때 다음과 같은 페이지가 나오면 성공입니다.



 

위의처럼 Http 요청에 대하여 XML 정보를 리턴하는 것을 볼 수 있습니다.

자세한 사항은 네이버 개발자 센터에 사용방법이 잘 나와 있습니다.

http://dev.naver.com/openapi/apis/contents/rank


이제 이것을 안드로이드에서 보여주는 것을 해보겠습니다.

리스트 뷰에 네이버 검색어 실시간 순위를 보여주는 예제입니다.


메인 레이아웃을 다음과 같이 편집합니다.

<?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"

>

<Button

android:id="@+id/Button"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="갱신"

>

</Button>

<ListView

android:id="@+id/ListView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

</ListView>

</LinearLayout>


리스트 뷰와 실시간 검색 순위 갱신을 위한 버튼을 넣었습니다.

이제 네이버 오픈 API 연동을 위해 키값을 xml 리소스에 String 값으로 넣겠습니다.


res/values/strings.xml 을 다음과 같이 편집합니다.


이번 프로젝트를 위해서는 전처럼 인터넷 접속권한이 필요합니다.

안드로이드 매니페스트 파일에 인터넷 권한을 추가합니다.



 

이제 리스트뷰와 네이버 오픈API 를 연결해보겠습니다.


소스를 다음과 같이 편집합니다.

package com.HttpComponentsEx;


import java.io.IOException;

import java.io.StringReader;

import java.util.ArrayList;


import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.ResponseHandler;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.BasicResponseHandler;

import org.apache.http.impl.client.DefaultHttpClient;

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserException;

import org.xmlpull.v1.XmlPullParserFactory;


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;


public class HttpComponentsEx extends Activity {

    ArrayList<String> items = new ArrayList<String>();

    ArrayAdapter<String> adapter;

    ListView listView;

    Button button;


    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);


        listView = (ListView) findViewById(R.id.ListView);

        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);

        listView.setAdapter(adapter);

        button = (Button)findViewById(R.id.Button);

        button.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                updateSearchRank();

            }

        });

        

        updateSearchRank();

    }


    public void updateSearchRank() {

        items.clear();

        final String query = "http://openapi.naver.com/search?key=" + getString(R.string.key)

                + "&target=rank&query=nexearch";


        HttpClient client = new DefaultHttpClient();

        HttpGet httpGet = new HttpGet(query);

        ResponseHandler<String> handler = new BasicResponseHandler();


        try {

            String response = client.execute(httpGet, handler);


            XmlPullParser xpp = XmlPullParserFactory.newInstance().newPullParser();

            xpp.setInput(new StringReader(response));


            int eventType = xpp.getEventType();

            boolean isItemBegin = false;

            while (eventType != XmlPullParser.END_DOCUMENT) {

                if (eventType == XmlPullParser.START_TAG) {

                    if (xpp.getName().equals("K")) {

                        isItemBegin = true;

                    }

                } else if (eventType == XmlPullParser.END_TAG) {

                    isItemBegin = false;

                }

                if (isItemBegin) {

                    if (eventType == XmlPullParser.TEXT) {

                        items.add(xpp.getText());

                    }

                }

                xpp.next();

                eventType = xpp.getEventType();

            }

        } catch (ClientProtocolException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } catch (XmlPullParserException e) {

            e.printStackTrace();

        }

        adapter.notifyDataSetChanged();

    }

}


굵은 부분의 updateSearchRank 메소드가 핵심 소스입니다.


HttpClient 는 인터페이스기 때문에 DefaultHttpClient 클래스와 같은 하위 객체로 생성해야 합니다.

ResponseHandler 역시 인터페이스여서 BasingResponseHandler 클래스로 생성하였습니다.


HttpClient 객체에 excute() 메소드를 실행하면 HttpResponse 객체를 반환하지만,

execute 메소드에 String 템플릿형 ResponseHandler 를 넘겼기 때문에 정보를 String 객체로 반환해 줍니다.


네이버 오픈 API 의 경우 XML 정보이기 때문에 String으로 관리하는 것이 더 쉽습니다


그 뒤에는 StringReader 를 이용하여 xml정보를 파싱하고 리스트와 연결된 String 배열에

검색어 순위를 집어 넣습니다.


버튼을 클릭하는 경우 역시 updateSearchRank() 메소드를 실행하여 

현재 실시간 검색어를 받아오는 것이죠.


결과 화면입니다.





보시는 바와 같이 네이버 실시간 검색어 순위대로 리스트에 뿌려졌습니다. 


물론 갱신을 하는 경우 현재의 순위로 업데이트 됩니다.


그외에도 OpenAPI 를 이용하여 많은 작업을 해볼 수 있겠지만,

여기서는 개념적인 것을 우선 알아보는 것이므로 여기까지만 해보도록 하죠.


Comments