IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Open Feign 发送GET请求入参为@RequestBody时调用失败 -> 正文阅读

[网络协议]Open Feign 发送GET请求入参为@RequestBody时调用失败

前言

最近在优化代码,将部分码帮帮代码重写了一下,然后就发现了Open Feign 发送GET请求入参为@RequestBody时调用失败的问题!

问题重现

controller层
在这里插入图片描述
fegin层
在这里插入图片描述
这里可能有人对controller层有疑问,不是说GET只支持@PathVariable(URL入参),@RequestParam(Params入参),这里其实只是常见的,我只能说这是常规规范而已,具体的细节请看往期文章前后端分离项目VUE使用axios调用微服务SpringBoot后端接口无法获取参数,这篇文章中有详细说明前后端各种入参、传递、解析规则!

调用测试
在这里插入图片描述
这里我调用发现,调用是失败的,异常信息是不支持请求方法’POST’,但是我这里明明使用的是@GetMapping("/basic/data/getSysDictDataByIds")方式,只不过携带的参数是@RequestBody!很迷!

原因分析

深入源码
HttpClientFeignConfiguration
在这里插入图片描述
这个类在不存在ILoadBalancer时才触发,我们项目开启了Ribbon,所以肯定存在,再看注释:载入负载均衡ribbon clients需要走FeignRibbonClientAutoConfiguration这个类配置
进入FeignRibbonClientAutoConfiguration源码
在这里插入图片描述
看红框注释:按照导入从上往下的序:HttpClientFeignLoadBalancedConfiguration>OkHttpFeignLoadBalancedConfiguration>DefaultFeignLoadBalancedConfiguration,对应的底层http工具:httpclient>okhttp>HttpURLConnection

根据http协议定义是支持@RequestBody+ RequestMethod.GET的,那么具体就得看工具包实现的不同的,查看源码发现okhttp和HttpURLConnection都不支持(报错),只有httpclient支持。(默认走HttpURLConnection会报错)

httpclient支持@RequestBody+ RequestMethod.GET
只有httpclient支持@RequestBody+ RequestMethod.GET,所以我们必须满足条件走HttpClientFeignLoadBalancedConfiguration才行,看下源码:
在这里插入图片描述
先决条件ApacheHttpClient.class类存在时!这就涉及到HTTP协议的问题了,这里采用的是Apache HTTP的协议。

解决方案

导入feign-httpclient依赖

 <dependency>
     <groupId>io.github.openfeign</groupId>
     <artifactId>feign-httpclient</artifactId>
 </dependency>

补充

URLConnection
报405错误,说明http方法不对,但是feign配置是GET方法,查feign的日志也是用的GET方法。后来发现原因是URLConnection在的原因:对于有request body的GET方法,自动改为POST方法了。
OkHttp
直接报错:method GET must not have a request body.
ApacheHttpClient
完美支持。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:37:38  更:2021-11-28 11:38:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:44:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码