前段时间在开发公司的积分商城,前期都没啥问题,一切都很顺利,到了跟前端联调的时候,尴尬了,吵起来了,搞得我很不爽,具体原因如下:



大致原因是:他说
get请求携带body他那里处理不了,我就很奇怪了,为什么试配不了,当时很无语,一口咬定就觉得是他的问题,因为我所有的接口都测试过的,用Postman请求过都是可以的,他给的理由是前端封装了,是这样封装的,没办法,当时我只能满怀怨气的改了,贼鸡儿不爽,因为他没给我一个合适的理由,哈哈
跟他聊完之后,想了很久,总觉得不对,我们公司也不小,是个上市公司,里面大佬还是有的,所以我觉得这样封装肯定是有理由的,主要是想给自己一个理由,不然想不通为啥前端要这样封装,为什么不能做这样的请求!前端说的因为公司这样封装了一套,很明显是错的,他自己也不清楚为什么,就是公司这样规定,所以他遵守了,也这样做了…
然后就开始找资料,看了一些博客,说:
HTTP协议定义的报文是支持GET请求携带body的,所以这个问题不是HTTP协议限制的;使用postman可以传递携带body的GET请求到Spring的web server,所以也不是web server/tomcat限制的;最后,根据逻辑链路排除法,得出的结论是浏览器引擎不支持GET请求携带body。
说了感觉没说,没任何依据,不足以说服人
后来自己去查看了Http协议,结果发现惊喜,里面有一段是这样写的:
A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.
http规范明确说了get请求携带body属于未定义行为,至于未定义行为有什么后果,那就是各家的实现可以有天壤之别,想怎么实现都可以,所以浏览器最好的做法就是禁止发送带有payload的get请求,因为你根本不知道这个请求在网络上传输时会被解释成什么样子。至于postman之类的工具,我猜可能是因为它本身就是用于调试http请求的,所以支持payload无可厚非。至于某些服务器支持这种语义,也不代表网络上所有设备都支持,所以 GET 不能携带 body 是事实上的标准。
其实很多人都强调一点:GET请求不应携带请求体,服务器应忽略(或者说丢弃)GET请求的请求体,依据也能在协议中找到:
[RFC2616] A server SHOULD read and forward a message-body on any request; if the request method does not include defined semantics for an entity-body, then the message-body SHOULD be ignored when handling the request.
[RFC2616] A message-body MUST NOT be included in a request if the specification of the request method does not allow sending an entity-body in requests.
但为什么还是有人这样用呢,甚至开发很久的程序员,也没意识到这个问题,难道是用的人多了?错的也是对的?不过即使这样,也不是这样使用的一个理由!
当然,包括我在内
当然还有一个原因:在后续的http协议中,RFC2616已经过时,把SHOULD应该也去了,要求更加宽松
[RFC7230] Request message framing is independent of method semantics, even if the method does not define any use for a message body.
但错的就是错的
规范地址: datatracker.ietf.org
| GET | POST | PUT | DELETE | |
|---|---|---|---|---|
| 请求是否有主体 | 否 | 是 | 是 | 可以有 |
| 成功的响应是否有主体 | 是 | 是 | 否 | 可以有 |
| 安全 | 是 | 否 | 否 | 否 |
| 幂等 | 是 | 否 | 是 | 是 |
| 可缓存 | 是 | 否 | 否 | 否 |
| HTML表单是否支持 | 是 | 是 | 否 | 否 |
后来我跟同事说了这个问题,他立即反驳我说:
但凡你用过es都不会这样说了
看下es的查询接口,是不是GET+body
然后继续查资料:
查了下,ES确实支持用GET+body查询,但文档也说了,并不是所有客户端都支持GET+body,所以查询也同时支持了POST。
虽然对ES了解不深,但我的感觉是ES主要是当作一个数据库来使用的,针对ES的查询也基本是由后端去发起的,因此对客户端的能力(GET能否携带body)是能够提前知道的,而针对web开发的大部分场景并不是这样的,api的作者并不知道客户端的能力,要求必须要使用支持GET+body的请求库才能使用这个接口也是不合理的,因此针对web的api不应该使用GET+body的方式并没有什么问题。
总结来说就是,ES是在特定场景重新去定义了GET+body的语义,而针对通用的web API作者并不适合。
ES对get请求携带body说明:www.elastic.co
任何原因都不要主观下结论,事实依据很重要
事实证明,我是菜逼!!
我似乎无法理解这个可能很简单的问题..假设我有日期..Fri,14Sep201218:37:50+0200我如何找出这个月的这个日期是星期几?是第一个,第二个..?第三个?谢谢! 最佳答案 为什么要使用图书馆?Ruby默认有它:Weeknumber:Theweek1ofYYYYstartswithaSundayorMonday(accordingto%Uor%W).Thedaysintheyearbeforethefirstweekareinweek0.%U-Weeknumberoftheyear.Theweekstartswith
在Rails3.x应用程序中,我正在使用net::ssh并向远程pc运行一些命令。我想向用户的浏览器显示实时日志。比如,如果两个命令在net中运行::ssh执行即echo"Hello",echo"Bye"被传递然后"Hello"应该在执行后立即显示在浏览器中。这是代码我在rubyonrails应用程序中使用ssh连接和运行命令Net::SSH.start(@servers['local'],@machine_name,:password=>@machine_pwd,:timeout=>30)do|ssh|ssh.open_channeldo|channel|channel.requ
我正在为Jekyll编写一个转换器插件,需要访问一些页眉(YAML前端)属性。只有内容被传递给主要的转换器方法,似乎无法访问上下文。例子:moduleJekyllclassUpcaseConverter关于如何在转换器插件中访问页眉数据有什么想法吗? 最佳答案 基于Jekyll源代码,无法在转换器中检索YAML前端内容。根据您的情况,我看到了两种可行的解决方案。您的文件扩展名可以具有足够的描述性,以提供您本应包含在前言中的信息。看起来Converter插件的设计就是这么基本的。如果修改Jekyll是一个选项,您可以更改Convert
一、简介之前在Vue项目中使用过element的上传组件,实现了点击上传+拖拽上传的两种上传功能。然后我就在想是否可以通过原生的html+js来实现文件的点击上传和拖拽上传,说干就干。首先是点击获取上传文件自然没的说,只需要借助input标签即可,但原生的点击上传按钮,实在是过于简陋,所以我的想法是通过一个div,模拟成上传按钮,然后监听其点击事件,通过input.click()去模拟点击真正的上传元素。然后是拖拽获取上传文件,这个稍有难度,我的想法是通过HTML5新增的drag拖放API+dataTransfer来实现文件的拖拽获取,但是由于是html5新增的,所以可能在某些低版本IE浏览器
一、介绍一下vercelvercel是一个站点托管平台,提供CDN加速,同类的平台有Netlify和GithubPages,相比之下,vercel国内的访问速度更快,并且提供Production环境和development环境,对于项目开发非常的有用的,并且支持持续集成,一次push或者一次PR会自动化构建发布,发布在development环境,都会生成不一样的链接可供预览。但是vercel只是针对个人用户免费,teams是收费的首先vercel零配置部署,第二访问速度比github-page好很多,并且构建很快,还是免费使用的,对于部署个人前端项目路、接口服务非常方便vercel类似于git
我正在从一个大型CSV文件中提取日期时间字符串,如下所示:"11/19/200821:56"我只想提取小时,这样我就可以构建所有小时的直方图以找到最频繁的小时。同样,我想从日期中提取星期几(名称)并构建最频繁日期的直方图。我是Ruby的新手,查了资料,初学者尝试了以下各种形式,但没有运气:require'date'putsDateTime.strptime("11/19/200821:56",'%I')您能否建议一种简单(清晰)的方法来完成上述任务?此外,任何关于如何表示结果的建议都会很棒。我在想一个小时的哈希数组(24个条目)和一个天的哈希数组(7个条目)?当我遍历日期时间字符串时加
🐱个人主页:不叫猫先生🙋♂️作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!💫系列专栏:vue3从入门到精通、TypeScript从入门到实践📢资料领取:前端进阶资料以及文中源码可以找我免费领取🔥前端学习交流:博主建立了一个前端交流群,汇集了各路大神,一起交流学习,期待你的加入!(文末有我wx或者私信)目录前言一、vue自定义指令directive讲解二、基于DOM的实现方式1.思路整理2.新建index.vue3.新建`directives`文件4.在`directives`文件下创建`index.ts`文件5.在`main.ts`中全局引
一、乱花迷人眼我就是被迷的那双眼。有时候需求来了,用熟悉的套路进行开发,确实很节省时间也能保证功能的稳定,但是这些开发的惯性无形中阻碍了我对技术的探索。我一直想改造详情页,解放重复功能开发的劳动力,但是详情页一眼望都是内容平铺,好像并没有什么可做的代码设计。后来我拨开繁花,发现详情页的组件化不必想的过于复杂,后台系统风格统一即可。因为大部分的详情页面是内容的展示,偶尔会出现少量的操作功能。将风格统一的部分进行组件化处理,操作功能使用回调函数放回当前页面,避免组件里做过多的业务逻辑。看,这不就成了。项目基于React框架开发的,所以代码写法是JSX语法,组件开发使用的hooks函数式组件,UI框
这是一个非常简单的问题,之前可能有人问过并回答过,但我什么也没找到。无论如何,我需要一个12小时的范围/数组,比如中午12点到中午11点,中午12点到晚上11点。你可能明白了它的要点。现在我正在尝试做一个荒谬复杂的方法,涉及将AM映射到一个阵列,PM到另一个阵列,然后将两个阵列连接在一起。必须有一种更简单的方法来做到这一点。我知道Railstime_select,但我需要一种不同于它提供的格式。有什么建议么?澄清:所以我正在寻找的是12-hourclock,与AM和PM。如果我想要一个24小时制的时钟,我可以执行(0..24),然后就完成了。但是12小时制从12点到11点,然后从12点
2023届EDA领域校招总结,完结撒花!!!目录前言一、EDA公司介绍二、项目面试1.自我介绍2.项目深入3.专业经验4.成果和技能5.对面试官有什么问题三、C++面试1、高频考点2、其他知识点3、算法题四、逻辑综合面试1.逻辑综合知识详解2.开源逻辑综合ABC五、简历制作总结前言2022/08/26:本人2023年6月毕业,于2022年7-10月参加秋招,面试总结纯属个人经验,仅供参考面试的是EDA前端软件开发岗位,也会掺杂一些EDA其他流程的面试在面试过程中发现自己准备的很乱,没有一个清晰的思路,现在把自己面试的所有经历和题型整理出来,在这里做一个小的总结,不仅帮助自己整理思路,也给大家做