OkHttp

OkHttp — це популярна бібліотека для роботи з HTTP-запитами в Android. Вона надає потужний і гнучкий API для виконання мережевих запитів. OkHttp забезпечує високу продуктивність, простоту використання і підтримує сучасні мережеві протоколи, такі як HTTP/2 і WebSocket.


Чому варто використовувати OkHttp?

  1. Простота та зручність: Інтуїтивний API для створення і відправки запитів.
  2. Підтримка HTTP/2: Менше з'єднань і краща швидкість передачі.
  3. Підтримка WebSocket: Для побудови додатків у реальному часі.
  4. Масштабованість: Можливість кастомізації через інтерцептори.
  5. Автоматичне кешування: Зменшення навантаження на сервер і збереження даних офлайн.

Додавання OkHttp до проекту

Щоб використовувати OkHttp у вашому проекті, додайте залежність у build.gradle:

dependencies {
    implementation 'com.squareup.okhttp3:okhttp:4.11.0'
}

Основи використання OkHttp

1. Виконання GET-запиту

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class NetworkUtils {

    private final OkHttpClient client = new OkHttpClient();

    public String sendGetRequest(String url) throws IOException {
        // Створення запиту
        Request request = new Request.Builder()
                .url(url)
                .build();

        // Виконання запиту
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            return response.body().string();
        }
    }
}

2. Виконання POST-запиту

import okhttp3.*;

import java.io.IOException;

public class NetworkUtils {

    private final OkHttpClient client = new OkHttpClient();

    public String sendPostRequest(String url, String json) throws IOException {
        // Створення тіла запиту
        RequestBody body = RequestBody.create(json, MediaType.get("application/json; charset=utf-8"));

        // Створення запиту
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        // Виконання запиту
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            return response.body().string();
        }
    }
}

3. Асинхронні запити

OkHttp дозволяє виконувати запити у фоновому потоці за допомогою методу enqueue.

public void sendAsyncRequest(String url) {
    Request request = new Request.Builder()
            .url(url)
            .build();

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

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                System.out.println("Response: " + response.body().string());
            }
        }
    });
}

4. Використання інтерцепторів

Інтерцептори дозволяють виконувати операції перед або після відправлення запиту, наприклад, додавання заголовків.

import okhttp3.*;

import java.io.IOException;

public class CustomClient {

    public OkHttpClient getClientWithInterceptor() {
        return new OkHttpClient.Builder()
                .addInterceptor(chain -> {
                    Request request = chain.request().newBuilder()
                            .addHeader("Authorization", "Bearer YOUR_TOKEN")
                            .build();
                    return chain.proceed(request);
                })
                .build();
    }
}

Кешування

OkHttp підтримує автоматичне кешування відповідей для зменшення кількості запитів до сервера.

import okhttp3.Cache;
import okhttp3.OkHttpClient;

import java.io.File;

public class CacheConfig {

    public OkHttpClient getClientWithCache(File cacheDir) {
        int cacheSize = 10 * 1024 * 1024; // 10 MB
        Cache cache = new Cache(cacheDir, cacheSize);

        return new OkHttpClient.Builder()
                .cache(cache)
                .build();
    }
}

Робота з WebSocket

OkHttp спрощує роботу з WebSocket-з'єднаннями для додатків у реальному часі.

import okhttp3.*;

public class WebSocketExample {

    private final OkHttpClient client = new OkHttpClient();

    public void connectWebSocket(String url) {
        Request request = new Request.Builder()
                .url(url)
                .build();

        WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() {
            @Override
            public void onOpen(WebSocket webSocket, Response response) {
                System.out.println("WebSocket Opened");
                webSocket.send("Hello, Server!");
            }

            @Override
            public void onMessage(WebSocket webSocket, String text) {
                System.out.println("Message: " + text);
            }

            @Override
            public void onClosed(WebSocket webSocket, int code, String reason) {
                System.out.println("WebSocket Closed: " + reason);
            }

            @Override
            public void onFailure(WebSocket webSocket, Throwable t, Response response) {
                t.printStackTrace();
            }
        });
    }
}

Кращі практики

  1. Асинхронність: Використовуйте асинхронні запити для уникнення блокування головного потоку.
  2. Безпека: Завжди обробляйте виключення та перевіряйте відповідь сервера.
  3. Кешування: Використовуйте кеш для оптимізації мережевих ресурсів.
  4. Тестування: Використовуйте MockWebServer для створення тестів.

Висновок

OkHttp є одним із найкращих інструментів для роботи з мережею в Android. Він поєднує в собі простоту, потужність і розширюваність, що робить його ідеальним вибором як для невеликих, так і для великих проектів.