我不知道我做错了什么,但每次假装客户端将声明为get的方法转换为post类型。
@FeignClient(name = "my-service", url = "http://localhost:8114", path = "service")
public interface MyServiceClient {
@RequestMapping(method = GET, value = "/clients")
Client getClients(@QueryMap MyPojo pojo);
}
@Getter
@Setter
public class MyPojo {
@NotNull
private String someValue;
@NotNull
private SomeEnum someEnum;
}
此设置应解析为以下请求:GET http://localhost:8114/service/clients?someValue=foo&someEnum=bar
但每次我都得到这样的结果:
{
"timestamp": 1542378765498,
"status": 405,
"error": "Method Not Allowed",
"exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
"message": "Request method 'POST' not supported",
"path": "/service/clients"
}
但是,当我这样做时,它工作得很好:
@RequestMapping(method = GET, value = "/clients?someValue=foo&someEnum=bar")
Client getClients();
我正在使用spring-cloud-starter-feign 1.2.7.RELASE
版本,其中包含feign-core/sl4fj/hystrix/ 9.3.1
版本,但我也在10.1.0版本上测试了它,结果相同。
我应该怎么做才能解决这个问题?
5条答案
按热度按时间kxe2p93d1#
在我的项目中,我使用
spring-cloud-dependencies
和Camden.SR7
版本,其中包含9.3.1
feign版本,目前最新的版本是Finchley.RELEASE
,其中包含feign9.7
,我看到它专用于spring-boot 2.x.x
,但我的整个基础设施(配置/Eureka 服务器)运行在1.5.x
上,所以它产生了下一个问题。我看了一下github的feign文档,我发现@Param
注解可能会有帮助,但是当我在有3个参数的方法中使用它时,它会抛出异常Method has too many Body parameters~
。最后,spring的注解@RequestParam
可以作为解决方案,但是我没有找到任何可以合并这些注解的信息源。我没有找到
spring-cloud-dependencies
版本,其中包含9.7
feign,它是专门为spring-boot 1.5.x
应用程序。hl0ma9xz2#
我遇到了Spring的
@FeignClient
的一个示例,它出于不同的原因将GET请求转换为POST。在我的例子中,被调用的REST API使用一个HTTP查询参数。调用此API的Feign客户端方法有一个用@QueryParam
注解的参数(即javax.ws.rs.QueryParam)。Feign显然没有识别出这个注解,因此在请求体中使用该方法参数作为表单的post参数(并将请求方法转换为POST),而不是将其用作查询参数。修复方法是将
javax.ws.rs.QueryParam
注解替换为org.springframework.web.bind.annotation.RequestParam
。这个案例发生在spring-cloud-openfeign-core-2.2.5.RELEASE。
p3rjfoxz3#
如前所述HERE:feign 9.3.1确实支持带POJO的@QueryMap,你需要使用Map,尝试更新到feign 9.7或10.0.1
qzwqbdag4#
在我的例子中,我使用
@Param
将请求参数传递给GET端点。我不知道为什么,但显然假装转换成一个POST请求。我用
@QueryMap
替换@Param
解决了问题样品:
现在Feign发送一个正确的GET http方法。
i7uaboj45#
我遇到了类似的问题,使用Feign和Sping Boot 并使用单个复杂对象作为参数。我成功地解决了这个问题,因为我认识到:
1.如果在@Parameter旁边没有指定@SpringQueryMap,Feign会将参数对象转换为json并将其放入请求体。
1.由于带有body的GET请求并不真正符合http标准,Feign使用的默认http客户端会自动将GET转换为POST。但是,可以解决这个问题:如果将Apache Http客户端5作为依赖项添加到项目中,Feign将自动使用它而不是java.NET. http. HttpClient。而Apache的客户端并没有改变方法,所以它将保持GET。(请注意,参数对象仍将以json的形式在body中传输。)
Sping Boot 的自动配置功能将处理其余部分。