【问题标题】:How to post string with FeignClient如何使用 FeignClient 发布字符串
【发布时间】:2018-03-31 09:27:17
【问题描述】:

服务器使用request.getInputStream() 获取请求正文。

客户端代码:

@FeignClient(name="composer-agent")
public interface ComposerClient {
    @RequestMapping(value = "/agent/import_bp", method = RequestMethod.POST)
    String importBlueprints(String payload);
}

但我得到一个例外:

Caused by: feign.FeignException: status 500 reading ComposerClient#importBlueprints(String); content:
{"timestamp":"2017-10-19T06:15:47-0400","status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"MIME type may not contain reserved characters"}
    at feign.FeignException.errorStatus(FeignException.java:62)
    at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91)
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
    at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108)
    at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:301)
    at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:297)
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
    ... 144 common frames omitted

我也尝试设置consumes = MediaType.APPLICATION_JSON_VALUE 或其他值,或者添加@RequestBody,但我得到了同样的异常。

那么我该如何处理这个问题呢?谢谢。

【问题讨论】:

  • "status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"MIME type may not contain reserved characters"。您的 mimetype 似乎包含非法字符。所以问题是:您使用的是哪种 mimetype(代码中未显示)?

标签: java spring-boot spring-cloud


【解决方案1】:

当底层 HTTP 客户端是 Apache HTTP 客户端时,这是 Feign 9.3.0 中的 known bug。解决方案是升级feign-httpclient 依赖。例如:

compile "io.github.openfeign:feign-httpclient:9.5.0"

【讨论】:

  • 我用的是spring-cloud,依赖是:org.springframework.cloudspring-cloud-starter-feign依赖>
  • 我用接口创建客户端。有什么建议吗?
  • 添加我记录的依赖项,其版本与云启动器引入的版本相匹配。如果cloud starter引入的版本有bug,升级你的spring-cloud版本。 Maven 有一个显示所有依赖版本的目标来帮助你。
  • 我收到了错误。我使用feign.RequestInterceptor 定义了一个拦截器,并透明地传输所有标头。所以如果content-type的请求与@FeighClient中配置的不同,就会发生异常。
猜你喜欢
  • 2017-02-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
相关资源
最近更新 更多