OkHttp 服务端开发完全指南
·
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 等)
更多推荐




所有评论(0)