OkHttp Android 예제 자습서

OkHttp은 2013년에 Square에서 소개한 서드 파티 라이브러리로, HTTP 기반의 네트워크 요청을 보내고 받기 위한 것입니다.

OkHttp Android

초기에 Android에는 HttpURLConnectionApache HTTP Client 두 가지만이 있었습니다. 각각의 클라이언트는 웹에서 데이터를 보내고 받기 위해 AsyncTask 또는 백그라운드 스레드 메서드 내에 많은 보일러플레이트 코드를 필요로 했습니다. 더구나 이러한 클라이언트들은 HTTP 요청 또는 커넥션 풀링을 취소할 때 제한 사항을 가지고 있었습니다. OkHttp Android는 별도의 종속성을 사용하지 않고 java Socket의 상단에서 직접 작동하여 HttpURLConnectionApache Client 인터페이스의 구현을 제공합니다.

OkHttp Android의 장점

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

  1. 커넥션 풀링
  2. Gziping
  3. 캐싱
  4. 네트워크 문제에서의 복구
  5. 리다이렉트
  6. 재시도
  7. 동기 및 비동기 호출 지원

동기 vs 비동기 호출

  • 동기 호출은 AsyncTask 래퍼가 필요합니다. 이것은 요청을 취소하는 것을 지원하지 않습니다. 또한, AsyncTasks는 일반적으로 Activity의 컨텍스트를 누출시키는 경향이 있으며 이는 선호되지 않습니다.
  • 비동기 호출은 네이티브 취소, 여러 요청에 태그 지정 및 단일 메서드 호출로 모두 취소할 수 있는 기능을 지원하는 것이 권장됩니다 (onPause 또는 onDestroy 메서드에서 Activity 인스턴스에 대해 cancel을 호출함).

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을 사용했습니다. RequestBuilder에서 post(RequestBody body) 메서드가 관련 값을 사용하여 호출됩니다. 로그에는 다음과 같은 응답이 표시됩니다. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}. OkHttp는 Retrofit 네트워킹 라이브러리 내부에서 사용되는 권장 HttpClient입니다. 다음 튜토리얼에서 이에 대해 자세히 살펴 보겠습니다. 레이아웃에 각 메서드, postRequest(), run() 및 AsyncTask 래퍼 클래스를 호출하는 세 개의 버튼을 추가했습니다. 아래 링크에서 최종 Android OkHttp 프로젝트를 다운로드할 수 있습니다.

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

Source:
https://www.digitalocean.com/community/tutorials/okhttp-android-example-tutorial