如何在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
相关产品推荐
相关产品推荐

