OkHttp本身是客户端库(用于发送 HTTP 请求),没有内置服务端功能,但官方提供了配套的mockwebserver库,专门用于搭建轻量级 HTTP 服务端(测试服务、Mock 接口、本地代理服务都适用)。
这是 Java/Android 生态最常用的轻量级 HTTP 服务端方案,完美兼容 OkHttp 生态。
一、核心依赖
Maven
xml
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>mockwebserver</artifactId> <version>4.12.0</version> </dependency>Gradle
gradle
implementation 'com.squareup.okhttp3:mockwebserver:4.12.0'二、快速入门:最简服务端
直接启动一个 HTTP 服务,返回固定响应:
java
运行
import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import java.io.IOException; public class SimpleServer { public static void main(String[] args) throws IOException { // 1. 创建服务端实例 MockWebServer server = new MockWebServer(); // 2. 设置响应(预设返回结果) server.enqueue(new MockResponse() .setBody("{"msg":"Hello OkHttp Server"}") // 响应体 .setResponseCode(200) // 状态码 .addHeader("Content-Type", "application/json")); // 请求头 // 3. 启动服务(指定端口,传0则自动分配) server.start(8080); System.out.println("服务启动成功:http://localhost:" + server.getPort()); // 服务会一直运行,直到手动关闭 // server.close(); // 关闭服务 } }启动后访问:http://localhost:8080即可得到 JSON 响应。
三、进阶用法:动态处理请求(核心)
实际开发中,服务端需要根据请求路径、参数、方法动态返回不同结果,这是最常用的场景:
java
运行
import okhttp3.mockwebserver.*; import okhttp3.Headers; import java.io.IOException; import java.nio.charset.StandardCharsets; public class DynamicServer { public static void main(String[] args) throws IOException { MockWebServer server = new MockWebServer(); // 自定义请求分发器(核心:动态处理所有请求) server.setDispatcher(new Dispatcher() { @Override public MockResponse dispatch(RecordedRequest request) { // 获取请求信息 String path = request.getPath(); // 请求路径 /user String method = request.getMethod(); // 请求方法 GET/POST String body = request.getBody().readString(StandardCharsets.UTF_8); // 请求体 Headers headers = request.getHeaders(); // 请求头 // 根据路径动态响应 return switch (path) { case "/api/user" -> new MockResponse() .setBody("{"name":"OkHttp服务端","age":20}") .setHeader("Content-Type", "application/json"); case "/api/hello" -> new MockResponse() .setBody("你好,动态响应!") .setResponseCode(200); // 404 不存在的接口 default -> new MockResponse().setResponseCode(404).setBody("接口不存在"); }; } }); // 启动服务 server.start(8080); System.out.println("动态服务启动:http://localhost:8080"); } }支持的核心功能
- 获取请求路径、方法、请求头、请求体、参数
- 自定义响应状态码、响应头、响应体、响应延迟
- 支持GET/POST/PUT/DELETE所有 HTTP 方法
四、常用高级配置
1. 模拟网络延迟(测试超时场景)
java
运行
new MockResponse() .setBody("响应数据") .setBodyDelay(1, TimeUnit.SECONDS); // 延迟1秒返回2. 模拟错误响应
java
运行
new MockResponse().setResponseCode(500).setBody("服务器内部错误");3. 获取客户端请求日志(调试用)
java
运行
// 取出请求记录(阻塞式,必须有请求才会返回) RecordedRequest request = server.takeRequest(); System.out.println("请求路径:" + request.getPath()); System.out.println("请求方法:" + request.getMethod());4. 长连接 / 保持服务运行
MockWebServer启动后会独立线程运行,无需手动阻塞主线程,适合长期运行的轻量服务。
五、适用场景
✅ 单元测试 / 接口测试 Mock 服务 ✅ 前端开发本地模拟接口 ✅ Android/iOS 调试用本地服务 ✅ 轻量级内部工具服务
❌ 不适合:高并发生产环境服务端(请用 SpringBoot/Tomcat/Netty)
六、完整关闭服务
java
运行
// 优雅关闭 Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { server.close(); System.out.println("服务已关闭"); } catch (IOException e) { e.printStackTrace(); } }));总结
- OkHttp = 客户端,MockWebServer = 配套轻量级服务端
- 核心类:
MockWebServer(服务)、Dispatcher(动态分发)、MockResponse(响应)、RecordedRequest(请求) - 开箱即用、无需配置、代码极简,适合测试 / 本地开发场景
- 生产环境请使用专业 Web 框架(SpringBoot、Netty 等)