본문 바로가기
Android/Concepts

HttpURLConnection을 이용한 HTTP 통신

by JuHy_ 2020. 4. 25.

HTTP 통신이란?

HTTP란 HyperText Transfer Protocol의 약자로 서버와 클라이언트 간 통신에 사용되는 규약이다.

소켓을 이용한 TCP/IP 통신을 기반으로 수행되지만, 거기에 HTTP 규약이 추가된 형태로 수행된다.

 

HTTP request와 response는 데이터의 정보를 담는 Header, 데이터를 담는 Body 부분으로 구성된다.

Header의 정보들은 개행(\r\n)으로 구분되며 개행이 두번 되는 지점부터 Body가 시작된다.

 

Request와 Response의 세부적인 구성은 다음과 같이 정의되어 있다.

 

Request Format

 

Response Format

 

HttpURLConnection 사용법

간단하게 네이버 홈페이지에 request를 보내는 과정을 구현해보자.

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.juhy.myapplication">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

코드를 작성하기 전 먼저 manifest에 INTERNET 권한을 추가해주자.

 

package com.juhy.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
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.MalformedURLException;
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 = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);

        Button button_start = findViewById(R.id.button);
        button_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                urlStr = editText.getText().toString();

                RequestThread thread = new RequestThread();
                thread.start();
            }
        });

    }

    class RequestThread extends Thread {
        @Override
        public void run() {
            try {
                URL url = new URL(urlStr);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                if(conn != null){
                    conn.setConnectTimeout(10000); // 10초 동안 기다린 후 응답이 없으면 종료
                    conn.setRequestMethod("GET");
                    conn.setDoInput(true);
                    conn.setDoOutput(true);

                    int resCode = conn.getResponseCode();
                    if(resCode == HttpURLConnection.HTTP_OK){
                        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);
            }
        });
    }

}

먼저 요청을 보낼 쓰레드를 만들어주고 다음과 같이 순서대로 구현해보자.

요청을 보내기 전 EditText를 하나 만들어 요청을 보낼 url을 불러오자. (여기서는 https://m.naver.com/ 사용) 

URL을 불러왔다면 다음과 같이 순서대로 수행하면 된다.

 

1. String URL을 통해 URL 객체 생성

 

2. url.openConnection() 함수를 통해 connection 생성

 

3. connection 옵션 설정

(Timeout은 응답을 기다릴 시간, RequestMethod는 요청 방식, DoInput DoOutput은 입출력 설정)

 

4. conn.getResponseCode() 함수를 통해 요청 전송

 

5. 정상적으로 응답이 오면(resCode=HTTP_OK) BufferReader를 통해 응답을 읽어 출력

 

6. 연결 종료

 

※ https가 아닌 http url을 사용할 경우 network 설정을 별도로 해주어야 하니 https url을 권장함.

 

 

정상적으로 응답을 받아 TextView에 띄워주는 것을 볼 수 있다.

 

 

Reference

[부스트코스]안드로이드 프로그래밍

https://www.edwith.org/boostcourse-android

'Android > Concepts' 카테고리의 다른 글

Gson을 이용하여 Json 파싱하기  (0) 2020.04.27
Volley 라이브러리 사용법  (0) 2020.04.26
Socket을 이용한 서버와 클라이언트 통신  (3) 2020.04.23
AsyncTask 사용법  (0) 2020.04.23
Thread와 Handler 사용법  (1) 2020.04.23