ABNF范式:https://www.jianshu.com/p/fe82f22f09f6
回顾一下根据ABNF范式对HTTP初始行的描述
start-line = request-line / status-line
请求头
request-line = method SP request-target SP HTTP-version CRLF
如 GET / HTTP/1.1
其中request-target在CRF中的描述为
request-target = origin-form / absolute / authority-form / asterisk-form
origin-form
origin-form = absolute-path[ "?" query ]
是指我们向源服务器发起请求的路径(未经过正向代理)
其中发起服务时若 absolute-path为空时,必须传值为 /
这个很好理解,我们在远程服务器上部署项目,通过nginx代理,进行路径访问
如 想访问www.xxx.com/a?a=2, /a?a=2就是,并不是跟完整的URI
absolute-form
absolute-form = absolute-URI
即访问正向代理的服务时,需要携带完整的URI (更多为了防止低版本的代理服务器传递时信息丢失)
如想访问 www.xxx.com/a?a=2, www.xxx.com/a?a=2整个就是
authority-form
authority-form = authority
仅用于CONNECT方法,即VPN、隧道,需要携带域名和端口和版本号
如CONNECT www.xxx.com:80 HTTP/1.1
asterisk-form
asterisk-form = “*”
仅用于OPTIONS方法,OPTIONS请求一般会在发送跨域请求前进行,用于测试支持哪些方法的跨域请求
用curl模仿OPTIONS请求响应头
statusline = HTTP-version SP status-code SP reasonphrase CRLF
status-code 为响应码
响应码分类
1xx : 请求已接受到需要进行进一步处理
2xx : 成功处理请求
3xx:重定向
4xx:客户端错误
5xx:服务端错误
补充:请求方法中的安全与幂是什么
在 HTTP 协议里,所谓的“安全”是指请求方法不会“破坏”服务器上的资源,即不会对服务器上的资源造成实质的修改。按照这个定义,只有 GET 和 HEAD 方法是“安全”的,因为它们是“只读”操作,只要服务器不故意曲解请求方法的处理方式,无论 GET 和 HEAD 操作多少次,服务器上的数据都是“安全的”。而 POST/PUT/DELETE 操作会修改服务器上的资源,增加或删除数据,所以是“不安全”的。
所谓的“幂等”实际上是一个数学用语,被借用到了 HTTP 协议里,意思是多次执行相同的操作,结果也都是相同的,即多次“幂”后结果“相等”。
很显然,GET 和 HEAD 既是安全的也是幂等的,DELETE 可以多次删除同一个资源,效果都是“资源不存在”,所以也是幂等的。
网友评论