前端视角 Java Web 入门手册 3.3:常用工具—— okHttp

okHttp 是一个高效的网络请求框架,默认支持

  • HTTP/2 支持允许对同一主机的所有请求共享一个套接字
  • 连接池减少了请求延迟(如果 HTTP/2 不可用)
  • 透明 GZIP 缩小了下载大小
  • 响应缓存完全避免了网络重复请求

Get a URL

java 复制代码
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

public class OkHttpGetExample {
    public static void main(String[] args) {
        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()) {
                String responseData = response.body().string();
                System.out.println(responseData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Post to a Server

java 复制代码
import okhttp3.*;

import java.io.IOException;

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

        MediaType mediaType = MediaType.get("application/json; charset=utf-8");
        String json = "{"key":"value"}";
        RequestBody body = RequestBody.create(mediaType, json);

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

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                String responseData = response.body().string();
                System.out.println(responseData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

和原生方案对比

Java 1.1 引入HttpURLConnection 用于处理 HTTP 请求的类,它提供了基本的 HTTP 请求功能,适用于简单的 HTTP 请求场景。但其使用过程相对繁琐、不支持链式调用、缺乏异步处理能力、对 HTTP/2 协议的支持有限,使用不是非常广泛

Java 11 引入了新的 HttpClient API,简化了 API,并且提供了原生 HTTP/2 支持,同时支持异步请求。

java 复制代码
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Java11HttpClientGetExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        // 创建 HttpClient 实例
        HttpClient client = HttpClient.newHttpClient();
        // 创建 HttpRequest 对象
        HttpRequest request = HttpRequest.newBuilder()
               .uri(URI.create("https://www.example.com"))
               .build();
        // 发送请求并获取响应
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        // 输出响应码和响应内容
        System.out.println("响应码: " + response.statusCode());
        System.out.println("响应内容: " + response.body());
    }
}

虽然 HttpClient 为 Java 开发者提供了一个强大且内置的 HTTP 客户端工具,但 OkHttp 依然凭借其丰富的功能特性、灵活的配置选项、强大的社区支持以及在特定环境下(如 Android 开发)的卓越表现,保持了其在许多项目中的不可替代性

  1. 拦截器机制: OkHttp 提供了灵活的拦截器机制,允许开发者在请求发送前和响应接收后插入自定义逻辑。这对于日志记录、请求修改、身份验证、重试策略等操作尤为方便。
  2. 高效的缓存机制:OkHttp 内置了强大的缓存功能,能够自动缓存服务器响应,减少重复的网络请求,从而提高应用性能。
  3. 灵活的连接池配置:OkHttp 提供了高度可定制的连接池选项,可以根据项目需求调整最大连接数、连接空闲时间等参数。通过有效管理连接池,OkHttp 能够重用现有连接,降低新建连接的开销,减少网络延迟,提升整体性能。
  4. 更好的 Android 兼容性
    • 官方推荐的 HTTP 客户端库:在 Android 开发中,OkHttp 被官方推荐为首选的 HTTP 客户端库,具有广泛的使用基础和良好的社区支持。
    • 优化移动网络性能:专为移动环境设计,OkHttp 在处理不稳定网络连接、数据压缩和延迟优化方面表现出色,确保应用在各种网络条件下的稳定性和高效性。
    • 易于集成:与 Android Studio 和常用框架(如 Retrofit)无缝集成,简化了网络请求的实现过程。

maven 依赖

xml 复制代码
<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>4.12.0</version>
</dependency>
相关推荐
长栎几秒前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode4 分钟前
Redis 在生产项目的使用
前端·后端
用户559822481229 分钟前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode9 分钟前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战11 分钟前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha30 分钟前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn30 分钟前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户7623524259135 分钟前
ShardingJDBC
后端
行者全栈架构师36 分钟前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_038 分钟前
mac(m5)平台编译openjdk
java