前端视角 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>
相关推荐
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌6 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
曹牧7 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX7 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法8 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7258 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎8 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄8 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端