为什么GET请求里不能用body?
[RFC7231] 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.
意思是往GET请求里加body是不符合规范的,不保证所有的实现都支持(主要是以前的实现,因为以前曾经有相应的规定)。
但是这一条并不是强制规定。
那么,GET和POST的区别和应用?这问题挺复杂。简而言之,就是“安全”和“不安全”的区别。什么是安全?不用承担责任。什么是不安全?可能需要承担责任。举个例子,点击某个链接以同意某个协议,这个请求明显就是不安全的,因为需要承担责任。如果采用GET,就违反了GET应该用于安全请求的规范。因为浏览器可能在你不知情的情况下预加载这个页面(因为是“安全”的GET请求),这样相当于你在不知情的情况下同意了某个协议,这显然是我们不希望看到的。在契约式的设计里,违反契约的行为是会带来严重的后果的。浏览器按照契约预加载了安全的GET请求,但这本身是不安全的,带来的后果自然要由打破契约的人承担(将这个请求设计成GET的人出来挨打)。
之所以强调“安全”,而不是按照常规的说法强调副作用,因为有副作用的请求不代表不安全;举例来说,服务器有一个显示访问人数的功能,这个功能就可以用GET来做。虽然每次访问都会发送改变服务器状态(计数器)的请求,但用户不会因为这个请求承担责任,这个请求是安全的。至于什么GET请求的URL有长度限制(后来事实证明其实没有),什么GET请求的URL里不能有中文(或者说非ASCII吧),都只是实现上的区别;从最初的设计上来说区别并不在这里。
当然,这些都是纯粹的理论层面的东西。如果遵守RESTful的规范,采用语义化的GET/POST请求,自然也就不会有这些问题了。因为通常来说,查询是安全的;这也是GET的主要作用。
,经常提起RFC,原来是叫“Request For Comments”。
# 项目中遇到的get请求参数丢失问题
传递的参数不要设为undefined,会被自动过滤掉,?后就没参数,系统可能报错,直接改成''就好了
queryParams: {
deptName: undefined,
status: undefined
}
const data={
orgName:this.queryParams.deptName,
status:this.queryParams.status
}
orgList(data).then(response=>{
this.deptList = this.handleTree(response.data, "deptId");
this.loading = false;
}).catch(e=>{
console.log(e)
this.loading = false
})
- 谨慎使用301,因为使用之后,客户端一直会使用301httpcode去处理数据,就算服务器重启也无效,除非客户端主动清除缓存
状态码 →