You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:22:45