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

Posted

技术标签:

【中文标题】无效的 HTTP 方法:PATCH > 正在执行 PATCH :引起:feign.RetryableException:【英文标题】:Invalid HTTP method: PATCH > executing PATCH : Caused by: feign.RetryableException: 【发布时间】:2016-05-24 06:39:21 【问题描述】:

我们正在使用 netflix feign 来调用 restful web 服务。对于补丁请求,似乎不支持补丁请求。

原因:feign.RetryableException:无效的 HTTP 方法:PATCH 执行补丁 https://projects.dev.xyz.com/projects/v1/users/uid/projects/guid 在 feign.FeignException.errorExecuting(FeignException.java:66) 在 feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:100) 在 feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:74) 在 feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:54) 在 com.netflix.hystrix.HystrixCommand$1.call(HystrixCommand.java:294)

【问题讨论】:

【参考方案1】:

如果有人遇到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>

【讨论】:

是的。如果您使用Feign.builder(),请继续阅读下一个答案... ;) ***.com/a/38058469/1326662【参考方案2】:

你可以使用 feign 的 httpClient 来解决这个问题。您想首先将模块添加到类路径中,然后在构建对象时对其进行配置 Feign.builder().client(new ApacheHttpClient())。这增加了对 PATCH 请求的支持。

文档链接:https://github.com/Netflix/feign/tree/master/httpclient

编辑:还有一个包装 apache 的 http 客户端的 feign 对象,link here

【讨论】:

【参考方案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

【讨论】:

顺便问一下为什么我们需要添加这个标题?【参考方案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>


【讨论】:

【参考方案5】:

我有依赖

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);
    

【讨论】:

以上是关于无效的 HTTP 方法:PATCH > 正在执行 PATCH :引起:feign.RetryableException:的主要内容,如果未能解决你的问题,请参考以下文章

获取无效 POST、PATCH 的 CORS 错误 - REST 端点

Ruby中使用patch HTTP方法

$http PATCH 方法不发送数据服务器端

MySQL JSON 查询:参数 1 中的 JSON 文本无效

RESTFul中的那些事----怎样支持RESTFul的HTTP Patch方法?

使用 Http Patch 上的对象列表的最佳方法