웹사이트 검색

OkHttp 안드로이드 예제 튜토리얼


OkHttp는 HTTP 기반 네트워크 요청을 보내고 받기 위해 2013년 Square에서 도입한 타사 라이브러리입니다.

OkHttp 안드로이드

OkHttp 안드로이드 장점

OkHttp가 제공하는 몇 가지 이점은 다음과 같습니다.

  1. 연결 풀링
  2. G압축
  3. 캐싱
  4. 네트워크 문제 복구
  5. 리디렉션
  6. 재시도
  7. 동기 및 비동기 호출 지원

동기 대 비동기 호출

  • 동기 호출에는 AsyncTask 래퍼가 필요합니다. 즉, 요청 취소를 지원하지 않습니다. 또한 AsyncTasks는 일반적으로 선호되지 않는 Activity의 컨텍스트를 유출합니다.
  • 비동기 호출은 기본 취소, 여러 요청 태그 지정 및 단일 메서드 호출로 모두 취소(onPause 또는 onDestroy 메서드 내 Acitivty 인스턴스에서 취소 호출)를 지원하므로 권장되는 방법입니다.

OkHttp android의 구현을 살펴보기 전에 다음 종속성을 추가합니다.

compile 'com.squareup.okhttp3:okhttps:3.4.1'

AndroidManifest.xml 파일 내부에 인터넷 권한을 추가합니다.

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

OkHttp Android 예제 코드

동기 호출을 위한 MainActivity.java는 다음과 같습니다.

package com.journaldev.okhttp;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    OkHttpClient client = new OkHttpClient();

    TextView txtString;

    public String url= "https://reqres.in/api/users/2";


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

        txtString= (TextView)findViewById(R.id.txtString);

        OkHttpHandler okHttpHandler= new OkHttpHandler();
        okHttpHandler.execute(url);
    }

    public class OkHttpHandler extends AsyncTask {

        OkHttpClient client = new OkHttpClient();

        @Override
        protected String doInBackground(String...params) {

            Request.Builder builder = new Request.Builder();
            builder.url(params[0]);
            Request request = builder.build();

            try {
                Response response = client.newCall(request).execute();
                return response.body().string();
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            txtString.setText(s);
        }
    }

}

비동기 호출의 경우 MainActivity.java는 다음과 같이 정의되어야 합니다.

package com.journaldev.okhttp;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {
    
    TextView txtString;
    public String url= "https://reqres.in/api/users/2";

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

        txtString= (TextView)findViewById(R.id.txtString);

        try {
            run();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    void run() throws IOException {

        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url(url)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                final String myResponse = response.body().string();

                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        txtString.setText(myResponse);
                    }
                });

            }
        });
    }

}

여기에서 테스트 API를 사용했습니다. 반환된 응답 문자열은 화면에 인쇄되는 JSON 형식입니다. Github API, Stackoverflow 등과 같은 다른 오픈 소스 API를 사용해 볼 수 있습니다.

OkHttp 쿼리 매개변수 예

쿼리 매개변수가 있는 경우 HttpUrl.Builder 클래스를 사용하여 쉽게 전달할 수 있습니다.

HttpUrl.Builder urlBuilder = HttpUrl.parse("https://httpbin.org/get).newBuilder();
urlBuilder.addQueryParameter("website", "www.journaldev.com");
urlBuilder.addQueryParameter("tutorials", "android");
String url = urlBuilder.build().toString();

Request request = new Request.Builder()
                     .url(url)
                     .build();

위 URL은 https://resttesttest.com/에서 가져왔습니다.

OkHttp Android 헤더 예제

인증된 쿼리 매개변수가 있는 경우 아래와 같이 헤더 형식으로 추가할 수 있습니다.

Request request = new Request.Builder()
    .header("Authorization", "replace this text with your token")
    .url("your api url")
    .build();

JSON 응답 처리

JSON 데이터를 구문 분석하여 관련 매개 변수를 가져와 아래 코드와 같이 TextView에 표시할 수 있습니다.

client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                final String myResponse = response.body().string();

                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {

                            JSONObject json = new JSONObject(myResponse);
                            txtString.setText(json.getJSONObject("data").getString("first_name")+ " "+json.getJSONObject("data").getString("last_name"));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });

            }
        });

OkHttp Android POST 예

지금까지 몇 가지 API를 호출하여 응답을 받는 방법을 살펴보았습니다. 서버에 데이터를 게시하려면 다음과 같은 방식으로 요청을 작성해야 합니다.

public class MainActivity extends AppCompatActivity {

    public String postUrl= "https://reqres.in/api/users/";
    public String postBody="{\n" +
            "    \"name\": \"morpheus\",\n" +
            "    \"job\": \"leader\"\n" +
            "}";

    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

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

        try {
            postRequest(postUrl,postBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    void postRequest(String postUrl,String postBody) throws IOException {

        OkHttpClient client = new OkHttpClient();

        RequestBody body = RequestBody.create(JSON, postBody);

        Request request = new Request.Builder()
                .url(postUrl)
                .post(body)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d("TAG",response.body().string());
            }
        });
    }
}

위의 코드에서 전달되는 데이터 유형을 정의하기 위해 OkHttp의 일부인 MediaType 클래스를 사용했습니다. https://reqres.in/의 테스트 API URL을 사용했습니다. post(RequestBody body) 메서드는 해당 값과 함께 RequestBuilder에서 호출됩니다. 로그에 다음 응답이 표시됩니다. {name:morpheus,job:leader,id:731,createdAt:2017-01-03T17:26:05.158Z}. OkHttp는 Retrofit 네트워킹 라이브러리 내에서 사용되는 권장 HttpClient입니다. 다음 자습서에서 이에 대해 살펴보겠습니다. 레이아웃에 각 메서드인 postRequest(), run() 및 AsyncTask 래퍼 클래스를 호출하는 세 개의 버튼을 추가했습니다. 아래 링크에서 최종 Android OkHttp 프로젝트를 다운로드할 수 있습니다.

OkHttp Android 예제 프로젝트 다운로드