无效的HTTP方法:PATCH > 执行PATCH : 由feign.RetryableException引起。

23
我们正在使用Netflix Feign来调用RESTful Web服务。对于PATCH请求,似乎不支持该请求。
引起原因:feign.RetryableException: 无效的HTTP方法:PATCH 执行PATCH https://projects.dev.xyz.com/projects/v1/users/{uid}/projects/{guid} at feign.FeignException.errorExecuting(FeignException.java:66) at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:100) at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:74) at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:54) at com.netflix.hystrix.HystrixCommand$1.call(HystrixCommand.java:294)
5个回答

21

如果有人在使用spring-cloud-feign时遇到相同的问题,只需添加Maven依赖项即可使用来自feign的httpClient:

    <dependency>
        <!-- Required to use PATCH -->
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
        <version>${feign.version}</version>
    </dependency>

1
如果你使用Feign.builder(),请继续阅读下一个答案... ;) https://dev59.com/QFsW5IYBdhLWcg3wHUKb#38058469 - Ralf

14
您可以通过使用来自Feign的httpClient来解决此问题。您需要首先将模块添加到类路径中,然后在构建对象时进行配置,使用Feign.builder().client(new ApacheHttpClient())。这将添加对PATCH请求的支持。
文档链接:https://github.com/Netflix/feign/tree/master/httpclient 编辑提示:还有一个包装了Apache Http客户端的Feign对象,链接在此处

4
如果您使用的是implementation("org.springframework.cloud:spring-cloud-starter-openfeign"),并且在使用补丁请求时遇到问题,则可以执行以下操作(Kotlin):
添加此依赖项。
 implementation("io.github.openfeign:feign-okhttp:10.2.0")

创建以下配置类:
class FeignOkHttpConfiguration {

    @Bean
    fun client(): OkHttpClient {
        return OkHttpClient()
    }
}

并将此配置添加到您的客户端(如果您希望这是每个Feign客户端的通用配置,则还可以为class FeignOkHttpConfiguration添加@Configuration)。

@FeignClient(name = "YourClient", url = "\${base-url}", configuration = [FeignOkHttpConfiguration::class])
interface YourClient {

@PatchMapping
fun update(model: YourModel): ResponseEntity<String>

}

添加 okhttp bean 和 lib 是我能够让它工作的唯一方法(Java)Spring Cloud 2022.0.1 和 Spring Boot 3。 - dale

3

我也遇到了同样的问题,但是通过添加feign-httpclient依赖并在请求中添加额外的头X-HTTP-Method-Override : PATCH来解决了它。

<dependency>
    <!-- Required to use PATCH -->
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>${feign.version}</version>
</dependency>

添加页眉
@RequestHeader(value="X-HTTP-Method-Override", defaultValue="PATCH") String xHttpMethodOveride

1
顺便问一下,为什么我们需要添加这个头部? - kushal Baldev

0

我有依赖关系

implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign'

而PATCH引起了麻烦,我还配置了自定义客户端以便在映射到响应类型之前处理原始响应。解决方案是添加适当的HTTP客户端依赖项,例如:

implementation group: 'io.github.openfeign', name: 'feign-httpclient', version: '11.7'

然后我使用ApacheHttpClient配置了我的客户端,如下:

    @Bean
    Client customClient(SessionStorage sessionStorage) {
        return new CustomClient(new ApacheHttpClient(), sessionStorage);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接