Spring Boot Feign Client调用第三方接口返回404错误的修复方案咨询
解决Feign Client自动移除末尾斜杠导致的404问题
这个问题确实挺头疼——Feign默认的URL规范化逻辑会自动砍掉末尾的斜杠,可第三方服务的端点明确要求路径以斜杠结尾,又没法修改服务端代码。下面给你几个实用的修复方案:
方案1:重构FeignClient路径,用路径变量(推荐)
把硬编码的完整URL拆成基础地址+路径模板,利用Feign的路径变量特性,既能保证末尾斜杠被保留,代码也更符合Feign的设计规范。
修改后的Kotlin代码:
import org.springframework.cloud.openfeign.FeignClient import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.http.ResponseEntity import javax.validation.Valid @FeignClient( value = "CalculatorClient", url = "http://localhost:8085" ) interface CalculatorClient { @PostMapping("/test/send/{destination}/{calculate}/{process}/") fun calculateInformation( @PathVariable destination: String = "S.MV00.S0.CAL_EXAMP", @PathVariable calculate: String = "KWX0.GAT0.REPLY___EXCHANGE_WITH_OTHER_ONE__.SO", @PathVariable process: String = "KWX0.GAT0.REPLY___EXCHANGE_WITH_OTHER_ONE__.AI", @RequestBody request: @Valid String ): ResponseEntity<String?> }
这里把原本硬编码在url里的动态部分抽成路径变量,还给变量设了默认值,调用时不用每次传参数。Feign会严格按照@PostMapping里的路径模板生成请求URL,包括末尾的斜杠。
方案2:自定义RequestInterceptor强制补全末尾斜杠
如果不想改动现有接口的方法定义,可以加个请求拦截器,在Feign发请求前检查URL是否以斜杠结尾,缺的话就手动补上。
先写拦截器类:
import feign.RequestInterceptor import feign.RequestTemplate import org.springframework.stereotype.Component @Component class TrailingSlashRequestInterceptor : RequestInterceptor { override fun apply(requestTemplate: RequestTemplate) { val currentUrl = requestTemplate.url() if (!currentUrl.endsWith("/")) { requestTemplate.url(currentUrl + "/") } } }
然后在FeignClient上指定使用这个拦截器:
import org.springframework.cloud.openfeign.FeignClient import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.http.ResponseEntity import javax.validation.Valid @FeignClient( value = "CalculatorClient", url = "http://localhost:8085/test/send/S.MV00.S0.CAL_EXAMP/KWX0.GAT0.REPLY___EXCHANGE_WITH_OTHER_ONE__.SO/KWX0.GAT0.REPLY___EXCHANGE_WITH_OTHER_ONE__.AI/", configuration = [TrailingSlashRequestInterceptor::class] ) interface CalculatorClient { @PostMapping fun calculateInformation(@RequestBody request: @Valid String): ResponseEntity<String?> }
这个方法不用改原有接口逻辑,拦截器会自动处理该FeignClient发出的所有请求。
方案3:禁用Feign的URL规范化(版本依赖型)
你也可以通过配置禁止Feign对URL做规范化处理,但这个配置在不同Spring Cloud Feign版本里可能有差异,不一定都生效:
在application.yml里加配置:
feign: client: config: CalculatorClient: # 指定目标FeignClient名称 decode-slash: false encode-slash: false
注意:Feign核心逻辑里对末尾斜杠的移除是独立于编码/解码配置的,所以这个方案优先级低于前两个。
内容的提问来源于stack exchange,提问作者firstpostcommenter
相关产品推荐
相关产品推荐

