spring FeignClient将GET方法转换为POST

pkln4tw6  于 2023-06-21  发布在  Spring
关注(0)|答案(5)|浏览(217)

我不知道我做错了什么,但每次假装客户端将声明为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版本上测试了它,结果相同。
我应该怎么做才能解决这个问题?

kxe2p93d

kxe2p93d1#

在我的项目中,我使用spring-cloud-dependenciesCamden.SR7版本,其中包含9.3.1 feign版本,目前最新的版本是Finchley.RELEASE,其中包含feign 9.7,我看到它专用于spring-boot 2.x.x,但我的整个基础设施(配置/Eureka 服务器)运行在1.5.x上,所以它产生了下一个问题。我看了一下github的feign文档,我发现@Param注解可能会有帮助,但是当我在有3个参数的方法中使用它时,它会抛出异常Method has too many Body parameters~。最后,spring的注解@RequestParam可以作为解决方案,但是我没有找到任何可以合并这些注解的信息源。

@RequestMapping(method = GET, value = "/clients")
Client getClients(@RequestParam("someValue") String someValue, @RequestParam("someEnum") String someEnum);

我没有找到spring-cloud-dependencies版本,其中包含9.7 feign,它是专门为spring-boot 1.5.x应用程序。

hl0ma9xz

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。

p3rjfoxz

p3rjfoxz3#

如前所述HERE:feign 9.3.1确实支持带POJO的@QueryMap,你需要使用Map,尝试更新到feign 9.7或10.0.1

qzwqbdag

qzwqbdag4#

在我的例子中,我使用@Param将请求参数传递给GET端点。我不知道为什么,但显然假装转换成一个POST请求。
我用@QueryMap替换@Param解决了问题
样品:

@RequestLine("GET")
MyObjResponse findByObjByIdAndNameUsingRequestParams(@QueryMap Map<String, String> queryMap);

现在Feign发送一个正确的GET http方法。

i7uaboj4

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中传输。)

<dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-hc5</artifactId>
        </dependency>

Sping Boot 的自动配置功能将处理其余部分。

相关问题