Android (안드로이드)

[Android] HTTP 통신 라이브러리 - OkHttp / 예제 / 사용법

Oscar:) 2024. 1. 24. 15:11

 

 

이번 포스팅에서는 HTTP 통신 라이브러리 중 하나인

OkHttp 사용법을 알아보겠다.

 

 

 


 

OkHttp 란?

 

 

공식 깃허브 ↓

 

 

GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

Square’s meticulous HTTP client for the JVM, Android, and GraalVM. - GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

github.com

 


 

Square 사에서 2013년도에 출시하였다.

(OkHttp3 기준)

 

깃허브에서 설명하는 OkHttp를 다음과 같이 요약할 수 있다.

 

'사용하기 쉽고 효율적인 HTTP 라이브러리'

 

Retrofit이 대중화되었음에도 불구하고 아직까지 많은 사랑을 받는 라이브러리다.

 

 

 

 

OkHttpClient와 Request를 각각 생성한 뒤,

OkHttpClient에서 newCall() 메서드를 통해 Request를 보내고

Callback을 받는 방식으로 작동한다.

 

 

동기 · 비동기 처리 방식 중 선택하여 사용할 수 있다.

(execute / enqueue)

 

 

 


 

사용해보기

 

 

✅ 의존성 추가

 

build.gradle(모듈 수준)에 다음 의존성을 추가해준다.

 

implementation 'com.squareup.okhttp3:okhttp:4.12.0'

 

최신 버전은 위 깃허브 링크에서 확인하기 바란다.

 

 


 

✅ 기본 문법

 

비동기 방식을 적용해볼 것이다.

 

// 1) OkHttpClient 초기화
OkHttpClient client = new OkHttpClient();

// 2) Request 초기화
Request request = new Request.Builder()
    .url('URL')
    .build();

// 3) 비동기 요청
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 응답 실패 시 작업
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        // 응답 성공 시 작업
    }
});

 

 

1) OkHttpClient를 초기화 해준다.

 

 

2) Request를 초기화 해준다.

 

.url() 메서드에 요청을 보낼 URL을 넣어주면 된다.

 

원래 이 곳에 GET, POST 등 HTTP Method를 작성해줘야 하는데,

OkHttp의 HTTP Method의 기본 값이 "GET" 이기 때문에 지금은 굳이 안 써줘도 된다.

 

 

3) OkHttpClient의 newCall() 메서드를 통해 Request를 보낸다.

 

enqueue() 메서드를 사용하였기에 비동기 방식으로 처리된다.

(execute() 메서드는 동기 방식으로 처리된다)

 

 


 

 

✅ 사용해 보자

 

서버에 간단한 php 파일을 만들고,

해당 URL로 요청을 보내서 응답을 확인해 보겠다.

 

위 문법에서 사용한 예제를 그대로 사용한다.

 

String url ="http://1.23.456.78/API_Test.php";

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) {
    
    Log.d(TAG, e);
    
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
    
    Log.d(TAG, response.body.string);
    
    }
});

 

'URL' 부분에 실제 경로를 넣어주었고,

응답 성공·실패 시 로그를 찍어놓았다.

 

 

해당 php 파일은 다음과 같다.

 

 

 

 

결과는 다음과 같다.

 

 

응답이 잘 도착하였다.

 

 

 


 

✅ 요청 파라미터 추가하기

 

위에서는 GET 메서드로 요청 파라미터 없이 단순 요청만 보냈다.

 

GET 메서드에 요청 파라미터를 추가하려면 HttpUrl.Builder를 사용할 수 있지만

POST 메서드를 사용하는 예제를 만들어 보겠다.

 

String url ="http://1.23.456.78/API_Test.php";

// FormBody 생성
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("name", "Oscar");
formBuilder.add("age", "3살");

// RequestBody 초기화
RequestBody requestBody = formBuilder.build();

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
    .url(url)
    .post(requestBody) // Http Method : POST, 보낼 데이터
    .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    
    Log.d(TAG, e);
    
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
    
    Log.d(TAG, response.body.string);
    
    }
});

 

 

베이스는 동일한 예제이니, 주석 추가한 부분만 유심히 보자.

 

 

- FormBody.Builder 객체를 초기화하고 (키, 값) 형식으로 데이터를 추가해준다.

 

- RequestBody 객체를 생성하여 FormBody.Builder로 초기화 해준다.

 

- 마지막으로 Request 객체를 초기화하는 부분을 보자.

 

Http Method = GET 을 사용할 때는 따로 작성하지 않았지만,

POST를 사용할 때는 post() 메서드를 추가해야 한다.

해당 메서드 인수로 RequestBody 객체를 넣어준다.

 

 

php 파일은 다음과 같이 수정했다.

 

 

POST 데이터를 받아서 출력하는 것 뿐이다.

 

 

결과는 다음과 같다.

 

 

응답이 잘 도착하였다.

 

 


 

✅ JSON 데이터 응답 받기

 

 

대부분의 API 응답은 JSON 형식으로 날아온다.

 

JSON으로 출력하도록 php 파일을 수정해준다.

 

 

 

 

 

OkHttpClient 객체의 onResponse() 부분만 보겠다.

 

@Override
public void onResponse(Call call, Response response) throws IOException {
    try {
    
        JSONObject jsonObject = new JSONObject(response);
        
        String name = jsonObject.getString("name");
        String age = jsonObject.getString("age");
        
        Log.d(TAG, name + "는 " + age + "입니다.");
        
    } catch (JSONException e) {
        throw new RuntimeException(e);
    }
}

 

응답 받은 response를 JSONObject로 파싱하면 된다.

 

JSON 형태에 따라 JSONArray를 사용해야 할 수도 있다.

 

 

결과는 다음과 같다.

 

 

 

 


 

 

 

 

 

이번 포스팅에서는 OkHttp 라이브러리에 대해 알아보았다.

 

 

 

여담)

OkHttp는 출시 당시에도 인기가 많았지만,
Retrofit이 공용화되었는데도 OkHttp를 함께 사용하는 케이스가 많기 때문에
아직까지도 사용성이 높은 라이브러리다.

나중에 Retrofit과 OkHttp를 함께 사용하는 내용을 일부 포스팅하지 않을까 싶다.

Okhttp는 흔히 Okhttp3 라고도 불리는데,
버전 이름일 뿐이다.

업데이트가 잦아서 버전이 3까지 순식간에 올라갔고,
3버전에서 현재까지 정착되어 있는 주요 기능들이 많이 배포되었다.

현재는 4버전을 넘어 5버전까지 바라 보고 있지만,
아직도 많은 사용자들이 OkHttp3라고 부른다.

 

 

 

 

다음 포스팅에서는 Retrofit 라이브러리에 대해 알아보겠다.