안드로이드

[Android] 5. 네트워킹 - 웹으로 요청하기

qbang 2019. 7. 29. 11:47

안녕하세요 이번 시간에는 5강 네트워킹의 세번째 강의인 '웹으로 요청하기' 리뷰입니다.

마찬가지로 개념을 알아보면서 실습한 내용을 덧붙여 알아보도록 하겠습니다!

 


웹으로 요청을 하고 응답을 받으면 응답 데이터를 확인하여 화면에 보여줄 수 있습니다.

애플리케이션에서 웹서버에 요청하는 방식은 표준 자바를 이용하여 요청할 때와 크게 다르진 않지만 스레드를 사용해야 합니다.

또한 Textview 등에 글자를 보이게 하고 싶다하면 스레드에서 응답을 받은 것이므로 핸드러를 사용해야 합니다.

 

<uses-permission android:name = "android.permission.INTERNET"/>

우선 소켓을 이용할 때와 마찬가지로 인터넷 권한을 부여해줘야하겠죠?

AndroidManifest.xml 파일을 열어 코드를 추가해줍니다.

 

package com.example.myhtpp;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    EditText editText;
    TextView textView;
    String urlStr;
    Handler handler = new Handler();

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

        editText = (EditText) findViewById(R.id.editText2);
        textView = (TextView) findViewById(R.id.textView);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v){
                urlStr = editText.getText().toString();
                RequestThread thread = new RequestThread();
                thread.start();
            }
        });
    }

    //웹으로 요청을 보내고 응답을 받는 스레드
    class RequestThread extends Thread{
        public void run(){


            try{
                URL url = new URL(urlStr);
                //사용자가 입력한 URL 정보를 이용해 URL 객체를 만들고 openConnection 메소드를 호출하면 HttpURLConnection 객체가 반환
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                if(conn != null){
                    //10초 동안 응답을 기다려서 응답이 없으면 끝냄
                    conn.setConnectTimeout(10000);
                    conn.setRequestMethod("GET");
                    conn.setDoInput(true);
                    conn.setDoOutput(true);

                    //getResponseCode 메소드를 호출하면 웹서버에 연결하고 응답을 받아줌
                    int resCode = conn.getResponseCode();

                    //들어오는 데이터를 받을 수 있는 통로 생성, BufferedReader 객체는 한 줄씩 읽어 들일 때 사용
                    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    String line = null;

                    while (true){
                        line = reader.readLine();
                        if(line == null){
                            break;
                        }
                        println(line);
                    }
                    reader.close();
                    conn.disconnect();
                }

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

    public void println(final String data){
        handler.post(new Runnable() {
            @Override
            public void run() {
                textView.append(data + "\n");
            }
        });
    }
}

위 코드에 대한 결과 화면은 아래와 같습니다.

초기 화면
결과 화면

실행을 하고 요청하기 버튼을 눌렀을 때 Naver의 응답을 받아 한줄씩 읽어와 출력해주는 것을 확인할 수 있습니다.

 

글 읽어주셔서 감사합니다 :)