首页 > Web开发 > 详细

http协议:三 (3)应该如何理解请求方法

时间:2021-08-23 11:10:00      阅读:20      评论:0      收藏:0      [点我收藏+]

Http/1.1规定了八种方法,单词必须都是大写的形式。
    1. GET:获取资源,可以理解为读取或者下载数据
    2. HEAD:获取资源的元信息;
    3. POST:向资源提交数据,相当于写入或上传数据;
    4. PUT:类似POST;
    5. DELETE:删除资源;
    6. CONNECT:建立特殊的连接隧道;
    7. OPTIONS:列出可对资源实行的方法;
    8. TRACE:追踪请求-响应的传输路径。

GET/HEAD
    ——从服务器获取资源
    HEAD和GET类似,也是从服务器获取资源,但是不会返回请求的实体数据,只有响应头(元信息),是GET的简易版,如果不需要资源的话,可以避免传输body数据的浪费。

POST/PUT
    ——向服务器提交数据,数据在body里
    PUT和POST作用类似,有微妙不同,通常POST标识新建,PUT标识修改

DELETE
    ——删除资源,危险性大,很少用

CONNECT
    ——要求服务器为客户端和另一台远程服务器建立一条特殊的链接,这时Web服务器充当代理的角色

OPTIONS
    ——要求服务器列出可对资源实行的操作方法,在响应头Allow字段里返回。功能有限,用处不大。Nginx没支持

TRACE
    ——用于对HTTP链路的测试或诊断,可以显示出请求 - 响应的传输路径。存在漏洞,会泄露网站的信息,所以通常也是禁止使用

安全与幂等
    安全:在HTTP协议里,所谓的安全,是指请求方法不会对服务器上的资源造成实质的修改,so 只有GET和HEAD是安全的,因为是只读操作。
    幂等:多次执行相同的操作,结果也都是相同的。so GET和HEAD 即是安全的也是幂等的,DELETE可以多次删除同一个资源,效果都是“资源不存在”,所以也是幂等。POST是新增或提交数据,多次提交会创建多个资源,所以不是幂等的。PUT是替换或更新数据,多次更新一个资源,资源还是第一次更新的状态。所以是幂等的。
    幂等:GET、HEAD、DELETE、PUT
    非幂等:POST

 幂等是指客户端操作对服务器的状态没有产生改变

 put的幂等是RFC定义的,当然你要实现出非幂等的功能也是可以的 put多用于restful api里

 更新应该对应的是put方法,patch的含义是更新部分资源,打补丁,两者的区别可能就是更新的范围大小。

 

问题

1、把 GET/POST 等请求方法对应到数据库的“增删改查”操作吗?请求头应该如何设计呢?

2、 TRACE/OPTIONS/CONNECT 方法能够用 GET 或 POST 间接实现吗?

回复:

TRACE用于跟踪请求,可以在GET或POST请求的响应头加上诊断相关的参数,比如请求耗时等;
OPTIONS用于获取请求方法,可以用GET请求访问‘/options‘之类的uri,服务端响应中返回允许方法;
CONNECT用于创建一个中间代理,用GET/POST请求,进行通知来触发这个连接的建立

 

3、关于options请求,get,post或者delete之前都有可能发出,为何会发出options请求?平时用webpack的代理来开发,代理到测试/生产环境的时候,get/post/delete请求之前没有options请求,但是部署到测试环境或者生产环境之后就会在get/post/delete请求之前会发出一个options请求?

回复:

options请求会在allow字段里列出可以对资源实施的操作方法,比如有的资源只支持get,有的只支持post/delete。
所以有的时候回先发一个options,来确定应该如何操作资源。
不过这个方法用的很少,其实没太大用处,因为即使资源不支持某种方法,直接返回一个405或者其他的状态码就可以了。(其实connect这个我觉得也挺多余,像WebSocket这样,用其他的方法就能够搞定。)

 

CORS跨域请求用到OPTIONS方法跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。在现在前端最常用的 cors 跨域中,浏览器都是用 OPTIONS 方法发预检请求的

 

4、get请求带上查询字符串例如?name=a+b,但是打开chrome的控制台network选项卡发现请求url那是对的,是xxx?name=a+b,但是最后的查询字符串那那里是name: a b,+号变成了空格,java那边收到的也是a b

最后的解决方法是前端encodeURIComponent一下,java那边URLDecoder.decode一下即可

回复:

uri里面有些字符是不允许出现的,需要编码和解码,而+正好就被解码成了空格。会用到encodeURI这样的函数

http协议:三 (3)应该如何理解请求方法

原文:https://www.cnblogs.com/xrxc/p/15174594.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!