You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中获取OkHttp的POST请求体及请求参数?

嘿,我之前也踩过这个坑!用OkHttp的时候确实没法用Servlet那套getReader()的方法,得用OkHttp自己的API来处理POST请求体的参数,分几种情况给你说:

1. 处理表单格式的请求体(application/x-www-form-urlencoded)

如果你的POST请求是普通表单提交,而且是用OkHttp的FormBody构建的,那直接强转后遍历就行:

Request request = ...; // 你的OkHttp请求对象
RequestBody body = request.body();
if (body instanceof FormBody) {
    FormBody formBody = (FormBody) body;
    // 挨个取出键值对
    for (int i = 0; i < formBody.size(); i++) {
        String paramKey = formBody.name(i);
        String paramValue = formBody.value(i);
        // 这里就可以处理你的参数啦
        System.out.printf("参数%s的值是%s%n", paramKey, paramValue);
    }
}

2. 处理JSON格式的请求体(application/json)

如果是JSON格式的请求体,得先把请求体内容读成字符串,再用JSON库(比如Gson或者Jackson)解析:

RequestBody body = request.body();
if (body != null) {
    Buffer buffer = new Buffer();
    body.writeTo(buffer);
    // 把请求体转换成字符串
    String jsonBody = buffer.readUtf8();
    
    // 用Gson解析成Map或者自定义实体类
    Gson gson = new Gson();
    Map<String, Object> paramMap = gson.fromJson(jsonBody, new TypeToken<Map<String, Object>>() {}.getType());
    // 要是有对应实体类的话更方便:
    // YourCustomEntity entity = gson.fromJson(jsonBody, YourCustomEntity.class);
}

3. 读取原始请求体内容(通用方法)

不管是什么格式,都可以先把请求体读成原始字符串,再根据Content-Type来解析:

RequestBody body = request.body();
if (body != null) {
    Buffer buffer = new Buffer();
    body.writeTo(buffer);
    String rawBody = buffer.readUtf8();
    
    // 获取Content-Type判断格式
    String contentType = body.contentType().toString();
    if (contentType.contains("application/x-www-form-urlencoded")) {
        // 手动解析表单参数
        String[] paramPairs = rawBody.split("&");
        for (String pair : paramPairs) {
            String[] keyValue = pair.split("=");
            if (keyValue.length == 2) {
                // 记得解码,因为表单参数是URL编码过的
                String key = URLDecoder.decode(keyValue[0], StandardCharsets.UTF_8);
                String value = URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8);
                // 处理参数
            }
        }
    } else if (contentType.contains("application/json")) {
        // 还是用JSON库解析,和上面一样
    }
}

⚠️ 注意:OkHttp的RequestBody默认是一次性的,调用writeTo之后就没法再用这个请求体发送请求了。如果之后还要复用,记得把读取到的字符串重新构建一个RequestBody:

MediaType mediaType = body.contentType();
RequestBody newBody = RequestBody.create(rawBody, mediaType);
Request newRequest = request.newBuilder().post(newBody).build();

内容的提问来源于stack exchange,提问作者chebad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:00:25