안드로이드 앱으로 웹으로 요청하기
activity_main.xml
웹으로 요청하기란 비연결성인 HTTP 프로토콜은 페이지 정보를 요청할 때마다 소켓을 새로 연결하고 응답을 받은 다음에는 소켓의 연결을 끓는 것이 일반적입니다.그리고 그 소켓 연결 위에서 HTTP 프로토콜에 맞는 요청을 보내고 응답을 받아 처리합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="사이트 주소 입력"
android:inputType="textPersonName" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="요청하기" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
</LinearLayout>
</ScrollView>
</LinearLayout>
activity_main.xml파일을 열고 디자인 화면에서 최상위 레이아웃을 리니어 레이아웃으로 변경합니다.리니어 레이아웃의 orientation속성 값은 vertical로 설정하고 그 안에 있던 텍스트뷰는 삭제합니다.팔레트에서 입력상자와 버튼을 하나씩 넣고 스크롤뷰를 추가한 후 그안에 텍스트 뷰 하나를 끌어다 추가합니다.입력상자에는 사이트 주소를 입력할 것이며 버튼을 누르면 그 사이트로부터 응답 데이터를 가져와 아래쪽의 텍스트뷰에 보여줄 것입니다.버튼에는 '요청하기'글자가 보이게하고,입력상자에는'사이트 주소 입력'이라는 글자가 안내 나타나도록 hint속성을 설정합니다.
MainActivity.java
package org.techtown.http;
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 androidx.appcompat.app.AppCompatActivity;
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;
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 = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String urlStr = editText.getText().toString();
new Thread(new Runnable() {
@Override
public void run() {
request(urlStr);
}
}).start();
}
});
}
public void request(String urlStr) {
StringBuilder output = new StringBuilder();
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (conn != null) {
conn.setConnectTimeout(10000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
int resCode = conn.getResponseCode();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
while (true) {
line = reader.readLine();
if (line == null) {
break;
}
output.append(line + "\n");
}
reader.close();
conn.disconnect();
}
} catch (Exception ex) {
println("예외 발생함 : " + ex.toString());
}
println("응답 -> " + output.toString());
}
public void println(final String data) {
handler.post(new Runnable() {
@Override
public void run() {
textView.append(data + "\n");
}
});
}
}
버튼을 누르면 사용자가 입력한 사이트 주소를 이용해 request메서드를 호출합니다.request 메서드안에서는 인터넷을 사용할 것이므로 스레드 안에서 동작하도록 스레드 객체를 하나 생성하고 그 안에서 request 메서드를 호출하도록 합니다.스레드에서 처리한 결과물을 화면에 표시할 떄 사용하도록 핸들러 객체도 만들어 변수에 할당해 둡니다.request 메서드의 코드는 다음과 같습니다.request 메서드에서는 응답 결과물을 모아 화면에 출력합니다.화면에 출력할 떄 사용하는 println메서드는 핸들러 사용하면서 화면에 들어있는 텍스트뷰의 append 메서드를 호출하도록 합니다.request 메서드 안에 정의된 웹페이지 요청 부분을 보면 가장 URL 객체를 만들고 있습니다.파라미터로 전달된 URL문자열을 이용해 만들어진 객체의 openConnection메소드를 호출하면 HttpURL-Connection객체가 반환됩니다.객체에서 GET방식으로 요청한다는 내용을 setRequestMethod로 설정하고getResponseCode메서드를 호출하면 이 시점에 내부적으로 웹 서버에 페이지를 요청하는 과정을 수행하게 됩니다.setConnectionTimeout메소드는 연결 대기 시간을 설정하는 것으로 10초 동안 연결되기를 기다린다는 의미 이며 setDoInput메서드는 이 객체의 입력이 가능하도록 만들어 줍니다.응답 코드가 HTTP_OK인 경우에는 정상적으로 응답이 온 경우이므로 응답으로 들어온 스크림을 문자열로 변환하여 반환합니다. -생략-