본문 바로가기
안드로이드

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

qbang 2019. 7. 29.

안녕하세요 이번 시간에는 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의 응답을 받아 한줄씩 읽어와 출력해주는 것을 확인할 수 있습니다.

 

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

댓글