안드로이드에서 HTTP를 사용해 웹에 정보를 요청하는 일은 표준 자바의 방식을 그대로 사용할 수 있다.


  • 1. URL 객체 생성
URL url = new URL("https://google.com"); //구글 연결을 위한 url 객체 생성

URL 객체의 파라미터로 전달하는 문자열에 "http://" 혹은 "https://"가 포함되면 HTTP 연결을 위한 객체를 만들게 된다.


  • 2. HttpURLConnection 객체 생성
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

URL 객체의 openConnection() 메소드를 호출하면 URLConnection 객체가 리턴된다. 그런데 URL객체를 만들 때 "https://" 문자열이 포함되어있어서 HTTP 연결을 위한 URL객체가 생성되었다. 따라서 리턴된 URLConnection 객체는 HttpURLConnection 객체로 타입 캐스팅할 수 있다.


  • 3. HttpURlConnection 객체의 입력 스트림을 통해 웹 페이지 데이터 가져오기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream());

InputStreamReader는 문자를 하나씩만 가져온다. 따라서 여기에 버퍼링을 사용하여 한 줄씩 가져올 수 있는 보조스트림인 BufferedReader의 도움을 받았다. 매개변수로는 스트림 객체를 넣어주어야 하는데, 우리가 연결을 구성한 웹페이지의 내용을 읽어올 것이므로 HttpURLConnection 객체의 입력 스트림을 넣어주었다. HttpURLConnection의 입력 스트림을 가져오기 위해서 `getInputStream() 메소드를 사용하였다.



나머지는 이제 사용자가 원하는 기능을 구성하기 나름이다. 위에서 생성한 객체들을 사용해서 웹페이지에 HTTP request를 보내서 응답을 읽어와서 화면에 표시하는 간단한 앱을 만들어보자.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp">

        <Button
            android:id="@+id/requestBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="요청"
            android:textSize="20dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dp"/>

        <EditText
            android:id="@+id/urlInput"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginHorizontal="10dp"
            android:layout_alignBottom="@+id/requestBtn"/>

    </RelativeLayout>

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/viewer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="10dp"
            android:background="#33000000"
            android:textColor="#ff000000"
            android:textSize="12dp"/>

    </ScrollView>


</LinearLayout>

URL 주소를 입력할 입력상자 및 웹페이지 요청을 위한 버튼, 그리고 가져온 내용을 표시할 텍스트뷰를 만들었다.


public class MainActivity extends AppCompatActivity {

    EditText urlInput; // URL 입력상자
    TextView viewer; // HTTP 응답내용 표시 영역

    Handler handler = new Handler(); // 메인 스레드 핸들러
    StringBuilder sb; // 읽어온 내용 저장할 스트링빌더 객체

    HttpThread thread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        urlInput = findViewById(R.id.urlInput);
        viewer = findViewById(R.id.viewer);

        Button requestBtn = findViewById(R.id.requestBtn);
        requestBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                thread = new HttpThread(); // HttpThread 객체 생성
                thread.start(); // 스레드 시작
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();
        try{
            thread.join(); //화면이 안보이게 될 때 스레드 해제
        }catch(Exception e){}
    }

    class HttpThread extends Thread{

        public HttpThread() {}

        @Override
        public void run() {

            sb  = new StringBuilder();

            try{
                URL url = new URL(urlInput.getText().toString().trim()); // 입력상자에서 URL 주소 가져오기
                HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // HTTP 연결 객체 생성

                if(conn!=null){
                    conn.setConnectTimeout(10000); // 타임아웃 10초로 설정
                    conn.setRequestMethod("GET"); // GET방식으로 요청

                    /* HttpURLConnection 객체의 입력, 출력 Enable */
                    conn.setDoInput(true);
                    conn.setDoOutput(true);

                    int resCode = conn.getResponseCode(); // 웹서버에 페이지 요청

                    /* HTTP 연결 입력 스트림 객체 참조 */
                    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

                    /* 스트림을 통해 내용 한줄씩 읽어들이면서 contents에 덧붙이기 */
                    String line = null;
                    while(true){
                        line = br.readLine();
                        if(line == null){
                            break;
                        }
                        sb.append(line+"\n");
                    }

                    br.close(); // 스트림 해제
                    conn.disconnect(); // Http 연결 해제
                }

            }catch(Exception e){
                e.printStackTrace();
            }

            /* 메인스레드의 핸들러를 통해 텍스트뷰에 내용 표시 */
            handler.post(new Runnable() {
                @Override
                public void run() {
                    viewer.setText(sb.toString());
                }
            });
        }
    }
}

위에서 설명한 메소드를 통해서 URL 객체를 만들고, 이 객체의 openConnection() 메소드를 통해 HttpURLConnection 객체를 만들었다. 이후 기타 부가적인 설정을 한 다음 스트림을 생성해 내용을 읽어들여서 텍스트뷰에 표시했다. 안드로이드는 정책상 네트워킹을 상요할 때 반드시 새로운 스레드를 만들어서 처리하도록 되어있다. 따라서 텍스트뷰에 가져온 내용을 업데이트 할 때 메인스레드의 핸들러를 사용했다.

앱을 실행하고 웹서버에 페이지를 요청하면 아래 사진과 같은 결과가 나온다.


1

+ Recent posts