Feign解决Get请求自动转化成POST的问题

探讨Feign客户端在特定条件下将GET请求错误地转换为POST请求的问题,及其实现原理与解决方案,包括配置Apache HttpClient以避免此类错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记一次无厘头报错:Request method ‘POST’ not supported
看起来很简单呐,就是不支持post请求嘛!!

场景:对接研究三方接口(微信推送),三方接口请求方式是GET方式,之前参数接收也是顺利完美的,但是研究个性消息推送的时候出现了问题,设置了推广二维码,用户扫码的关注后,收不到推送消息,系统直接报“Request method ‘POST’ not supported”错误,所以问题点显而易见!!但是吧,百思不得“姐”!!!
三方是get请求,但是为啥子现在又是post呢?

追查原因很简单,就是Feign在里面捣鬼!!!
它在服务器和三方之间,检测到请求里面有body,所以它就 默默的、偷偷的、悄悄的、无感的他把换成了POST请求!!!你没看错,所以就报错了!

特此铭记!!!!!

郁闷的一个问题:他就这么一改?三方get方式就相当于忽略了?
后续研究吧! 如有了解的,还请指教 谢谢!

另外奉上解决办法,可以解决Feign无感修改请求方式的方法:
借鉴:https://www.jianshu.com/p/b0b38667cc6b

Feign

/**
 * @author mirror
 */
@FeignClient(
        value = "pocket-account-management",
        configuration = FeignAccMgrServiceConfiguration.class)
public interface AccMgrService 
<think>好的,我现在需要分析用户提供的这段Java代码,并逐行解释其功能和潜在问题。首先,用户给出的代码分为三个部分:DTO对象的创建与赋值、服务接口定义以及Feign客户端定义。我需要详细理解每一部分的作用,同时注意可能存在的风险或错误。 首先看第一部分的代码,创建了EnterpriseSearchDTO实例,然后从voList中获取第一个元素的CorpID和Company设置到searchDTO中,接着调用Feign客户端的searchEnterprise方法。这里需要注意voList是否为空,否则get(0)会导致异常。此外,是否对searchDTO的字段进行了必要的校验,比如非空检查,或者是否有默认值处理。 接下来是IEnterpriseSearchService接口的定义,使用了Swagger的@Api和Spring的@RequestMapping注解,说明这是一个RESTful API接口,路径为/api/base/enterprisesearch。接口中的searchEnterprise方法用@PostMapping标注,接收EnterpriseSearchDTO作为请求体,并返回RestResponse。这里需要确认参数传递是否正确,异常处理是否合理,比如SystemException的抛出条件和处理机制。 然后是IEnterpriseSearchAdaClient接口,它继承自IEnterpriseSearchService,并使用了Feign相关的注解,如@FeignClient和@RequestMapping。这里需要注意Feign客户端的路径配置是否与服务端实际路径一致,以及@FeignClient中的value是否正确指向服务提供者名称。此外,@ApiIgnore的作用是排除该接口在Swagger文档中的显示,避免重复暴露接口信息。 接下来,我需要考虑可能的错误点。例如,voList可能为空,导致get(0)抛出异常,需要添加空集合检查。Feign客户端的路径拼接是否正确,比如服务端的基础路径和客户端定义的路径组合后是否正确。异常处理方面,调用searchEnterprise可能会抛出SystemException,调用方是否捕获并处理了该异常,避免程序崩溃。 此外,Swagger注解的使用是否恰当,确保API文档正确生成。RestResponse作为统一响应结构,是否包含必要的字段如状态码、消息和数据,以确保前端解析无误。DTO对象的字段是否有合适的校验注解,防止无效数据传递到服务端。 最后,总结用户可能关心的问题,比如如何避免空指针异常、路径配置错误、异常处理机制以及Swagger文档的正确性。需要将这些分析点转化为具体的建议和相关问题,帮助用户深入理解代码结构和潜在改进点。</think>### ✅ 核心逻辑逐行解析 --- #### **第一部分:DTO对象创建与远程调用** ```java // 创建EnterpriseSearchDTO实例 EnterpriseSearchDTO searchDTO = new EnterpriseSearchDTO(); // 从voList中获取第一个元素的CorpID(企业编号)赋值给searchDTO searchDTO.setQybh(voList.get(0).getCorpID()); // 从voList中获取第一个元素的Company(公司名称)赋值给searchDTO searchDTO.setZgs(voList.get(0).getCompany()); // 调用Feign客户端接口iEnterpriseSearchAdaClient的searchEnterprise方法 RestResponse<EnterpriseSearchVO> restResponse = iEnterpriseSearchAdaClient.searchEnterprise(searchDTO); ``` --- #### **第二部分:服务接口定义** ```java // Swagger注解:为接口添加标签"企业客户信息查询服务" @Api(tags = {"企业客户信息查询服务"}) // Spring的RequestMapping注解:定义接口的基础路径"/api/base/enterprisesearch" @RequestMapping({"/api/base/enterprisesearch"}) public interface IEnterpriseSearchService { // Swagger注解:描述接口方法为"企业客户信息查询" @ApiOperation("企业客户信息查询") // Spring的PostMapping注解:定义POST请求路径"/searchEnterprise" @PostMapping({"/searchEnterprise"}) // 方法定义:接收EnterpriseSearchDTO作为请求体,返回泛型为EnterpriseSearchVO的RestResponse RestResponse<EnterpriseSearchVO> searchEnterprise(@RequestBody EnterpriseSearchDTO var1) throws SystemException; } ``` --- #### **第三部分:Feign客户端定义** ```java // Swagger注解:忽略该接口在文档中的展示 @ApiIgnore // Feign注解:指定Feign客户端调用的服务名为ApplicationName.BASE(如"base-service"),并设置Spring的Bean名称为"enterpriseSearchClient" @FeignClient(value = ApplicationName.BASE, qualifier = "enterpriseSearchClient") // Spring的RequestMapping注解:定义客户端的基础路径"/api/enterpriseClient/client" @RequestMapping("/api/enterpriseClient/client") public interface IEnterpriseSearchAdaClient extends IEnterpriseSearchService { } ``` --- ### 🔍 逐行说明 #### **第一部分:DTO对象创建与远程调用** 1. **`EnterpriseSearchDTO searchDTO = new EnterpriseSearchDTO();`** - **功能**:创建一个`EnterpriseSearchDTO`对象,用于封装请求参数。 - **潜在问题**:未对`searchDTO`的字段进行初始化校验,需确保后续赋值逻辑完整。 2. **`searchDTO.setQybh(voList.get(0).getCorpID());`** - **问题**:未检查`voList`是否为空,直接调用`get(0)`可能导致`IndexOutOfBoundsException`。 - **修复建议**:添加空集合校验,例如: ```java if (CollectionUtils.isEmpty(voList)) { throw new IllegalArgumentException("voList为空"); } ``` 3. **`searchDTO.setZgs(voList.get(0).getCompany());`** - **功能**:将公司名称(`Company`)赋值给`searchDTO`的`zgs`字段。 - **潜在问题**:若`voList.get(0).getCompany()`为`null`,可能导致后续逻辑异常。 - **修复建议**:添加非空校验或默认值处理。 4. **`iEnterpriseSearchAdaClient.searchEnterprise(searchDTO);`** - **功能**:通过Feign客户端发起远程调用,查询企业信息。 - **潜在问题**: - 未处理`SystemException`异常,调用方需捕获或抛出。 - 未记录调用结果或错误日志,建议添加`try-catch`并记录日志。 --- #### **第二部分:服务接口定义** 1. **`@Api(tags = {...})`** - **功能**:Swagger注解,为接口分组,方便文档分类。 - **潜在问题**:需确保`tags`描述与业务逻辑一致,避免误导使用者。 2. **`@RequestMapping({"/api/base/enterprisesearch"})`** - **功能**:定义接口的基础路径,所有方法的URL会拼接此路径。 - **示例**:`/api/base/enterprisesearch/searchEnterprise`。 - **潜在问题**:若路径与实际部署不一致,会导致404错误。 3. **`@PostMapping({"/searchEnterprise"})`** - **功能**:定义POST请求路径,接收JSON格式的`EnterpriseSearchDTO`作为请求体。 - **潜在问题**:未指定`consumes`和`produces`,可能导致内容协商问题。 - **修复建议**:明确指定内容类型: ```java @PostMapping(path = "/searchEnterprise", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) ``` 4. **`RestResponse<EnterpriseSearchVO>`** - **功能**:统一响应包装类,包含状态码、消息和数据(`EnterpriseSearchVO`)。 - **潜在问题**:未明确`SystemException`的抛出条件,建议在接口文档中说明。 --- #### **第三部分:Feign客户端定义** 1. **`@ApiIgnore`** - **功能**:在Swagger文档中隐藏该Feign客户端接口,避免重复展示。 - **潜在问题**:需确保其他接口的Swagger注解配置正确。 2. **`@FeignClient(value = ApplicationName.BASE, ...)`** - **功能**:指定Feign客户端调用的服务名(如`base-service`),通过服务发现获取实例。 - **`qualifier`**:设置Spring Bean的名称为`enterpriseSearchClient`。 - **潜在问题**:若服务名配置错误,会导致服务调用失败。 3. **`@RequestMapping("/api/enterpriseClient/client")`** - **功能**:定义Feign客户端的基础路径,实际请求URL为: `http://base-service/api/enterpriseClient/client/searchEnterprise` - **潜在问题**: - 若服务端实际路径与`@RequestMapping`不匹配,会导致404错误。 - 建议与服务端接口路径保持一致。 --- ### ❗ 常见问题总结 1. **空集合访问风险** - `voList.get(0)`未校验集合是否为空,可能导致运行时异常。 2. **Feign路径拼接问题** - `IEnterpriseSearchAdaClient`的`@RequestMapping`与服务端接口路径需正确组合,否则请求失败。 3. **异常处理缺失** - `searchEnterprise`方法抛出`SystemException`,但调用方未捕获,可能导致程序中断。 4. **Swagger文档配置** - `@ApiIgnore`隐藏了Feign客户端,但`IEnterpriseSearchService`的接口描述需确保准确。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值