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

Spring Boot中OkHttp服务端返回Response时客户端无法获取预期响应体问题

问题分析与解决方案

核心问题:服务端返回OkHttp Response导致客户端拿到错误内容

你遇到的问题本质是Spring MVC无法识别OkHttp的Response对象作为HTTP响应的载体,它会把这个对象当作普通POJO进行序列化,所以客户端收到的是OkHttp Response对象自身的字段JSON(就是你看到的{"lazyCacheControl$okhttp":null,"redirect":false,"successful":true}),而不是你构建的ResponseBody里的业务数据。

OkHttp的Response是客户端用来接收HTTP响应的对象,并非Spring MVC服务端用来生成响应的类型,这完全是两个场景的API,不能混用。

正确的服务端实现方式

直接使用Spring MVC提供的响应类型来返回业务数据,让框架自动处理序列化和响应构建:

方式1:返回ResponseEntity(推荐)

@GetMapping(path = "/temp/getResponse2")
public ResponseEntity<ABNotes> testGETAWBNotes2() {
    final ABNotes abNotes = ABNotes.builder()
            .name("name")
            .remarks("remarks")
            .build();
    return new ResponseEntity<>(abNotes, HttpStatus.OK);
}

方式2:直接返回业务对象

@GetMapping(path = "/temp/getResponse2")
@ResponseBody // 如果控制器类没加@RestController,需要加这个注解
public ABNotes testGETAWBNotes2() {
    return ABNotes.builder()
            .name("name")
            .remarks("remarks")
            .build();
}

方式3:手动构建响应内容(特殊场景)

如果需要自定义响应体内容(比如手动序列化),可以返回ResponseEntity<String>:

@GetMapping(path = "/temp/getResponse2")
public ResponseEntity<String> testGETAWBNotes2() throws IOException {
    final ABNotes abNotes = ABNotes.builder()
            .name("name")
            .remarks("remarks")
            .build();
    String jsonContent = objectMapper.writeValueAsString(abNotes);
    return ResponseEntity.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .body(jsonContent);
}

关于OkHttp Response构建时的Request参数疑问

在你当前的场景下,这个Request参数完全没有意义——因为你不是用OkHttp作为服务端框架,而是Spring MVC。OkHttp的Response.Builder.request()是用来关联该响应对应的客户端请求,但你是在Spring MVC里手动构建这个对象,这个虚拟Request不会被Spring处理,也不会影响最终的HTTP响应。

如果一定要填,随便传入一个虚拟Request是可行的,但这完全是多余的操作,因为你根本不应该在Spring MVC里返回OkHttp Response对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:34:58