两个Web服务调用之间的ResponseEntity正文丢失

时间:2019-03-27 11:40:57

标签: java spring spring-boot spring-cloud-feign

我有一个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

1 个答案:

答案 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