前端视角 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>
相关推荐
一tiao咸鱼几秒前
还在手动海投?我做了个 AI 求职助手,自动筛选 BOSS 职位再精准投递
前端·后端·面试
蜗牛互联网22 分钟前
Java标准HTTP调用多模态模型的票据抽取前置校验
java·人工智能·python·http
码哥字节29 分钟前
Spring Boot 4.1 默认开虚拟线程,连接池为什么反而打满了?
spring boot·后端
工具派38 分钟前
Agent 不是玄学:用 Java 状态机思维理解 LangGraph
java·人工智能·python
大白801 小时前
CSS 盒模型精讲:标准盒模型与 IE 怪异盒模型区别
后端
深蓝AI1 小时前
Python 写 JSON 写到一半崩了?用 os.replace 保住上一版配置(附故障注入)
后端
十年Java程序媛1 小时前
String / StringBuilder / StringBuffer|别再乱用字符串拼接,底层原理一次讲透
java·spring boot·后端
傲世仙尊1 小时前
类和对象中-构造函数与析构函数把初始化清理自动化
java·运维·自动化
她的男孩1 小时前
权限通了、列表有数,一点分页就炸Forge Admin 用 COUNT(1) 扛住复杂待办
java·spring boot·mybatis
大勇前进1 小时前
CSS 选择器优先级详解,一次搞懂权重计算规则
后端