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

