我有一个Web服务,该服务调用另一个WS,并从第二个WS返回响应。看起来像这样:
// MyController
public ResponseEntity<Foo> requestFooController(@RequestBody @Valid Bar request) {
return this.myService.requestFooService(request);
}
//MyService
ResponseEntity<Foo> requestFooService(Bar request) {
Buzz improvedRequest = ...
return this.secondWS.secondRequestFoo(improvedRequest);
}
当我通过Postman调用API时,会收到一个HTTP OK响应,其中包含一个空的正文。但是,当我处于调试模式时,我可以看到该服务正在返回带有正文的ResponseEntity
。标头不会丢失。
我这样更改了代码,效果很好:
// MyController
public ResponseEntity<Foo> requestFooController(@RequestBody @Valid Bar request) {
ResponseEntity<Foo> tmp = this.myService.requestFooService(request);
return ResponseEntity.status(tmp.getStatusCode()).body(tmp.getBody());
}
现在通过邮递员,我确实拥有预期的身体。但是,我不了解该行为。我认为这可能是由于身体是某种可以被读取一次的流或类似的事实。但是从阅读源代码后,我看不到任何可以解释这种行为的东西。
我正在使用Netflix堆栈(因此两个WS之间的HTTP调用是通过Feign
客户端进行的。
知道为什么我会得到这个结果吗?
编辑: 有关我的任务的更多详细信息: SpringBoot 1.5.3。发布 假装2.0.5
答案 0 :(得分:0)
有一个错误会导致HTTP MultiPart POST的命名正文失败。其症状是您用主体发出POST请求,而Spring-Boot无法将其匹配到endint。我看到的例外是:
2019-01-23 15:22:45.046 DEBUG 1639 --- [io-8080-exec-10] .w.s.m.m.a.ServletInvocableHandlerMethod : Failed to resolve argument 3 of type 'org.springframework.web.multipart.MultipartFile'
org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present
Zuul正在缓存请求,以便多次重试。在此过程中,它无法保留二进制主体的命名字段。如果您以zuul开头请求,您可能会发现它起作用。因此,在路径http://myserver.com/myservice/endpoint
中使用zuul代替http://myserver.com/zuul/myservice/endpoint。这将有效避免保存请求和重试机制。
More details are available on this issue in Zuul's GitHub Bug List。