草庐IT

和前端吵架的一天

她与月色长留 2023-05-11 原文

前言

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

大致原因是:他说get请求携带body他那里处理不了,我就很奇怪了,为什么试配不了,当时很无语,一口咬定就觉得是他的问题,因为我所有的接口都测试过的,用Postman请求过都是可以的,他给的理由是前端封装了,是这样封装的,没办法,当时我只能满怀怨气的改了,贼鸡儿不爽,因为他没给我一个合适的理由,哈哈

自己说服自己

跟他聊完之后,想了很久,总觉得不对,我们公司也不小,是个上市公司,里面大佬还是有的,所以我觉得这样封装肯定是有理由的,主要是想给自己一个理由,不然想不通为啥前端要这样封装,为什么不能做这样的请求!前端说的因为公司这样封装了一套,很明显是错的,他自己也不清楚为什么,就是公司这样规定,所以他遵守了,也这样做了…

然后就开始找资料,看了一些博客,说:

HTTP协议定义的报文是支持GET请求携带body的,所以这个问题不是HTTP协议限制的;使用postman可以传递携带body的GET请求到Spring的web server,所以也不是web server/tomcat限制的;最后,根据逻辑链路排除法,得出的结论是浏览器引擎不支持GET请求携带body。

说了感觉没说,没任何依据,不足以说服人

1、然后:

后来自己去查看了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 是事实上的标准。

2、继续

其实很多人都强调一点: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

GETPOSTPUTDELETE
请求是否有主体可以有
成功的响应是否有主体可以有
安全
幂等
可缓存
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

结束语

  1. 任何原因都不要主观下结论,事实依据很重要

  2. 事实证明,我是菜逼!!

有关和前端吵架的一天的更多相关文章

  1. ruby-on-rails - 您如何找到一天在一个月中的星期几? - 2

    我似乎无法理解这个可能很简单的问题..假设我有日期..Fri,14Sep201218:37:50+0200我如何找出这个月的这个日期是星期几?是第一个,第二个..?第三个?谢谢! 最佳答案 为什么要使用图书馆?Ruby默认有它:Weeknumber:Theweek1ofYYYYstartswithaSundayorMonday(accordingto%Uor%W).Thedaysintheyearbeforethefirstweekareinweek0.%U-Weeknumberoftheyear.Theweekstartswith

  2. ruby-on-rails - 在 Rails 应用程序的前端获取实时日志 - 2

    在Rails3.x应用程序中,我正在使用net::ssh并向远程pc运行一些命令。我想向用户的浏览器显示实时日志。比如,如果两个命令在net中运行::ssh执行即echo"Hello",echo"Bye"被传递然后"Hello"应该在执行后立即显示在浏览器中。这是代码我在ruby​​onrails应用程序中使用ssh连接和运行命令Net::SSH.start(@servers['local'],@machine_name,:password=>@machine_pwd,:timeout=>30)do|ssh|ssh.open_channeldo|channel|channel.requ

  3. ruby - 如何在转换器插件中访问页面属性(YAML 前端) - 2

    我正在为Jekyll编写一个转换器插件,需要访问一些页眉(YAML前端)属性。只有内容被传递给主要的转换器方法,似乎无法访问上下文。例子:moduleJekyllclassUpcaseConverter关于如何在转换器插件中访问页眉数据有什么想法吗? 最佳答案 基于Jekyll源代码,无法在转换器中检索YAML前端内容。根据您的情况,我看到了两种可行的解决方案。您的文件扩展名可以具有足够的描述性,以提供您本应包含在前言中的信息。看起来Converter插件的设计就是这么基本的。如果修改Jekyll是一个选项,您可以更改Convert

  4. 前端实现文件上传(点击+拖拽) - 2

    一、简介之前在Vue项目中使用过element的上传组件,实现了点击上传+拖拽上传的两种上传功能。然后我就在想是否可以通过原生的html+js来实现文件的点击上传和拖拽上传,说干就干。首先是点击获取上传文件自然没的说,只需要借助input标签即可,但原生的点击上传按钮,实在是过于简陋,所以我的想法是通过一个div,模拟成上传按钮,然后监听其点击事件,通过input.click()去模拟点击真正的上传元素。然后是拖拽获取上传文件,这个稍有难度,我的想法是通过HTML5新增的drag拖放API+dataTransfer来实现文件的拖拽获取,但是由于是html5新增的,所以可能在某些低版本IE浏览器

  5. 教你如何使用vercel服务免费部署前端项目和serverless api - 2

    一、介绍一下vercelvercel是一个站点托管平台,提供CDN加速,同类的平台有Netlify和GithubPages,相比之下,vercel国内的访问速度更快,并且提供Production环境和development环境,对于项目开发非常的有用的,并且支持持续集成,一次push或者一次PR会自动化构建发布,发布在development环境,都会生成不一样的链接可供预览。但是vercel只是针对个人用户免费,teams是收费的首先vercel零配置部署,第二访问速度比github-page好很多,并且构建很快,还是免费使用的,对于部署个人前端项目路、接口服务非常方便vercel类似于git

  6. Ruby:如何从日期时间字符串中提取一个小时(或一天) - 2

    我正在从一个大型CSV文件中提取日期时间字符串,如下所示:"11/19/200821:56"我只想提取小时,这样我就可以构建所有小时的直方图以找到最频繁的小时。同样,我想从日期中提取星期几(名称)并构建最频繁日期的直方图。我是Ruby的新手,查了资料,初学者尝试了以下各种形式,但没有运气:require'date'putsDateTime.strptime("11/19/200821:56",'%I')您能否建议一种简单(清晰)的方法来完成上述任务?此外,任何关于如何表示结果的建议都会很棒。我在想一个小时的哈希数组(24个条目)和一个天的哈希数组(7个条目)?当我遍历日期时间字符串时加

  7. 前端基于DOM或者Canvas实现页面水印 - 2

    🐱个人主页:不叫猫先生🙋‍♂️作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!💫系列专栏:vue3从入门到精通、TypeScript从入门到实践📢资料领取:前端进阶资料以及文中源码可以找我免费领取🔥前端学习交流:博主建立了一个前端交流群,汇集了各路大神,一起交流学习,期待你的加入!(文末有我wx或者私信)目录前言一、vue自定义指令directive讲解二、基于DOM的实现方式1.思路整理2.新建index.vue3.新建`directives`文件4.在`directives`文件下创建`index.ts`文件5.在`main.ts`中全局引

  8. 「前端代码简洁之路」后台系统之详情页设计 - 2

    一、乱花迷人眼我就是被迷的那双眼。有时候需求来了,用熟悉的套路进行开发,确实很节省时间也能保证功能的稳定,但是这些开发的惯性无形中阻碍了我对技术的探索。我一直想改造详情页,解放重复功能开发的劳动力,但是详情页一眼望都是内容平铺,好像并没有什么可做的代码设计。后来我拨开繁花,发现详情页的组件化不必想的过于复杂,后台系统风格统一即可。因为大部分的详情页面是内容的展示,偶尔会出现少量的操作功能。将风格统一的部分进行组件化处理,操作功能使用回调函数放回当前页面,避免组件里做过多的业务逻辑。看,这不就成了。项目基于React框架开发的,所以代码写法是JSX语法,组件开发使用的hooks函数式组件,UI框

  9. ruby-on-rails - Rails 一天 12 小时 AM/PM 范围 - 2

    这是一个非常简单的问题,之前可能有人问过并回答过,但我什么也没找到。无论如何,我需要一个12小时的范围/数组,比如中午12点到中午11点,中午12点到晚上11点。你可能明白了它的要点。现在我正在尝试做一个荒谬复杂的方法,涉及将AM映射到一个阵列,PM到另一个阵列,然后将两个阵列连接在一起。必须有一种更简单的方法来做到这一点。我知道Railstime_select,但我需要一种不同于它提供的格式。有什么建议么?澄清:所以我正在寻找的是12-hourclock,与AM和PM。如果我想要一个24小时制的时钟,我可以执行(0..24),然后就完成了。但是12小时制从12点到11点,然后从12点

  10. 《EDA前端软件开发工程师面试指南》 - 2

    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其他流程的面试在面试过程中发现自己准备的很乱,没有一个清晰的思路,现在把自己面试的所有经历和题型整理出来,在这里做一个小的总结,不仅帮助自己整理思路,也给大家做

随机推荐