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");
    }
}

支持的核心功能

  1. 获取请求路径、方法、请求头、请求体、参数
  2. 自定义响应状态码、响应头、响应体、响应延迟
  3. 支持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();
    }
}));

总结

  1. OkHttp = 客户端MockWebServer = 配套轻量级服务端
  2. 核心类:MockWebServer(服务)、Dispatcher(动态分发)、MockResponse(响应)、RecordedRequest(请求)
  3. 开箱即用、无需配置、代码极简,适合测试 / 本地开发场景
  4. 生产环境请使用专业 Web 框架(SpringBoot、Netty 等)
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐