导出文件为什么用get请求而不用post请求?get请求和post请求有什么区别。

1,118 阅读5分钟

get请求和post请求的区别,不一定详细,但是粗略。

哈喽哈喽,我是小帅。今天小帅也是勤勤恳恳的搬砖。相信写过后台管理的小伙伴们都遇到过导出表格为xmls文件,前端的工作其实特别的简单,就是传递参数给后端,写一个好看的按钮,甚至都不要写按钮,antd,element-ui都有现成的按钮,那很简单我们需要做的就是调接口,把参数传递给后端,然后就会弹出浏览器的下载任务。但是呢,小帅发现了,在给后端发送请求的时候用的是window.open()这个api。

了解一下window.open()

Window 接口的 open()  方法,是用指定的名称将指定的资源加载到新的或已存在的浏览上下文(标签、窗口或 iframe)中。

语法:

  • open()
  • open(url)
  • open(url, target)
  • open(url, target, windowFeatures)

可以看出来它有三个参数

url:一个字符串,表示要加载的资源的 URL 或路径。如果指定空字符串("")或省略此参数,则会在目标浏览上下文中打开一个空白页。

target: 一个不含空格的字符串,用于指定加载资源的浏览上下文的名称。如果该名称无法识别现有的上下文,则会创建一个新的上下文,并赋予指定的名称。还可以使用特殊的 target 关键字_self_blank_parent 和 _top

windowFeatures: 一个字符串,包含以逗号分隔的窗口特性列表,形式为 name=value,布尔特性则仅为 name。这些特性包括窗口的默认大小和位置、是否打开最小弹出窗口等选项。支持以下选项: popup 如果启用此特性,则要求使用最小弹出窗口。弹出窗口中包含的用户界面功能将由浏览器自动决定,一般只包括地址栏。如果未启用 popup,也没有声明窗口特性,则新的浏览上下文将是一个标签

重点来了,为什么我们要使用window.openf发请求。两个原因,因为它能请求url,也就是发接口请求,但是它只能发get请求,对没错,get请求,不是get请求我们还不要。还有一个就是它的target参数里面有一个_blank。这很重要,对于导出表格来说。

听不懂了是吧,我来浅浅的解释一下吧。你看我们点导出文件是不是先向后端请求资源,请求到资源后触发浏览器的下载任务,浏览器处理这些事情的时候是不是要一个页面,你不希望你现在的页面跳转到请求到的url哪个地址吧。_blank参数就是打开一个新的窗口。你看请求url地址,打开一个新窗口,获取到资源之后触发下载的任务,然后关闭这个窗口,顺理成章这是其一。

其二 为什么一定要get请求,post请求行不行。好问题,这就涉及到get请求和post请求的区别。回想一下我们用post请求一般传递的参数是什么样的,以及它的返回数据是什么样的。没错,是json数据流。而我们的下载要流式传输,展示下载的进度嘛,所以在这个地方我们要用get而不用post请求。但是用get请求有一个很难受的点就是,它的参数是拼接在url地址栏,所以安全性不高,而且由于地址栏有限,所以参数也有限,不能传递过长的参数。

微信图片_20240828235705.png

这就是用get的后果,无限拼接url。记得拼接的时候做一下保证参数存在再拼接的处理。

post请求和get请求

作用:

  • get请求一般用于请求数据
  • post一般用于发送数据

安全性:

  • get请求的参数拼接在url地址栏,所以有重要的信息不要用get请求
  • post请求的参数在ruquestbody里面

误区: 从表面上看好像post请求更安全一点,因为参数不会像get请求一样直接暴露在url地址栏。但是其实都不安全,我也可以在request里面看到post传递的参数,而且我们对接口的时候不是经常看嘛。从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的。像不懂技术的人,他也不会去看url地址栏携带的参数呀,会技术的人你又防不住,所以不能单单说哪种请求安全性更高。

url的长度限制:

  • get请求本身没有长度的限制,但是为了解析url的性能,一般在1-8k之间,常见在2k以内,所以常说get请求参数有长度的限制,不能过长。
  • post请求没有长度的限制。

参数的数据类型:

  • GET只接受ASCII字符
  • post没有限制。

是否被浏览器缓存:

  • get请求可以被缓存,会被浏览器主动Cache
  • post请求不会被主动缓存(降低安全隐患,安全性较高),除非手动设置。

总结

其实请求方式还有很多,它们能做到的很多相同的事情,只不过有一些差别。所以在选择哪种请求的时候要根据实际情况去选择。有这么多种请求也是为了语义化,不如get用于请求,post用于发送,其实都可以。好了,先粗略的了解一下吧,有时间再详细的了解一下这些请求,给大家详细的总结一下。