OKHttp介绍及基本用法

110 阅读2分钟

OKHttp 是一个用于 Android 和 Java 应用程序的高效 HTTP 客户端。它提供了一种简洁的 API 来进行 HTTP 请求和响应,并具有良好的性能和强大的功能。OKHttp 由 Square 公司开发,它被广泛应用于 Android 开发中。

OKHttp 的主要特性

  1. 高效的连接池:重用连接以减少延迟。
  2. GZIP 压缩:自动处理请求和响应的 GZIP 压缩。
  3. 缓存机制:支持 HTTP 缓存以减少不必要的请求。
  4. 透明的内容协商:自动处理服务器返回的多种响应内容类型。
  5. 异步请求:支持同步和异步的网络请求。

OKHttp 的基本用法

以下是 OKHttp 的基本用法示例,包括同步和异步请求:

引入依赖

在使用 OKHttp 之前,需要在项目中引入相关的依赖。对于 Gradle 项目,可以在 build.gradle 文件中添加以下依赖:

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

同步 GET 请求

同步请求是在调用线程中执行的,这意味着在请求完成之前,线程会一直被阻塞。

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class SyncGetExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://www.example.com")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            System.out.println(response.body().string());
        }
    }
}

异步 GET 请求

异步请求不会阻塞调用线程,而是通过回调处理响应。

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

public class AsyncGetExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://www.example.com")
            .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()) throw new IOException("Unexpected code " + response);

                System.out.println(response.body().string());
            }
        });
    }
}

POST 请求

POST 请求通常用于发送数据到服务器。以下是一个同步 POST 请求的示例:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.MediaType;
import okhttp3.Response;
import okhttp3.MultipartBody;

public class SyncPostExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();

        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        String json = "{"name":"value"}";

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

        Request request = new Request.Builder()
            .url("https://www.example.com")
            .post(body)
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            System.out.println(response.body().string());
        }
    }
}

文件上传

以下是一个上传文件的示例:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.MediaType;
import okhttp3.Response;
import okhttp3.MultipartBody;
import java.io.File;

public class FileUploadExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();

        MediaType MEDIA_TYPE_PNG = MediaType.get("image/png");

        File file = new File("path/to/your/file.png");

        RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("file", file.getName(),
                RequestBody.create(file, MEDIA_TYPE_PNG))
            .build();

        Request request = new Request.Builder()
            .url("https://www.example.com/upload")
            .post(requestBody)
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            System.out.println(response.body().string());
        }
    }
}

OKHttp 提供了丰富的 API 和功能,可以满足大多数 HTTP 请求的需求。上面的例子只是基本用法,可以根据实际需求进行扩展和自定义。