HTTP协议解析

295 阅读4分钟

HTTP:(HyperText Transfer Protocol 超文本传输协议)刚开始是给浏览器使用的,注:以下图片来自小码哥教育

一:ABNF语法报文格式

截屏2021-09-14 上午10.36.23.png

HTTP报文是按照ABNF语法描述规范进行编写的,具体格式如下:

start-line*(head-field CRLF)CRLF[message-body]

  • start-line = request-line/status-line
    • request-line = method SP request-target SP HTTP-version CRLF
    • status-line = HTTP-version SP status-code SP reason-phrase CRLF
  • header-field = field-name:OWS field-value OWS
    • OWS = (SP / HTAB)
    • field-name = token
    • field-value = *(field-content / obs-fold)
  • message-body = *OCTET

SP代表空格,CRLF代表换行,*代表一个或多个,OWS代表空格或制表符,[] 代表可选

请求报文由请求行,请求头,请求体三部分组成,如果请求方式为Post请求,则我们发送的请求参数会放在请求体里,如果请求方式为GET请求,则请求参数直接拼接在URI后面,

示例:

请求报文

GET / HTTP/1.1

Host: www.baidu.com

Connection: keep-alive

响应报文

HTTP/1.1 200 OK

Cache-Control: no-cache

Connection: keep-alive

二:报文解析

1.请求方式,通常我们用的是Get和Post请求,

GET请求常用来做查询操作

POST常用来做增删改的操作

HEAD:请求得到与GET请求相同的响应,但没有响应体,使用场景:在下载一个大文件前,先获取其大小,再决定是否下载

OPTIONS:获取服务器支持哪些方法

PUT:用于对存在的资源进行覆盖

PATCH:用于对资源进行部分修改,资源不存在会创建

DELETE:用于删除指定的资源

TRACE:环回测试,主要用于HTTP请求的测试或诊断

2.HTTP版本

目前最广泛使用的是1.1版本,最新的是2.0版本由Google开发,3.0版本在草稿阶段

3.常见请求头

User-Agent:浏览器身份标识字符串

Host:服务器的域名,端口号

Date:发送的时间

Referer:前一个链接

Content-Type:请求体的类型,application/x-www-form-urlencoded(表单提交默认),multipart/form-data(文件上传),application/json(消息主体是序列化的json串),text/plain(空格转换为+符号,但不对特殊字符编码)

Content-Length:请求体的长度

Accept:能够接受的响应内容类型,text/plain等

Accept-Charset:能够接受的字符集,utf-8

Accept-Encoding:能够接受的编码方式列表

Accept-Language:能够接受的响应内容的自然语言列表en-US

Range:仅请求某个实体的一部分,断点续传

Origin:发起一个针对跨域资源共享的请求,和响应头Access-Control-Allow-Origin对应

Cookie:之前通过服务器Set-Cookie发送的Cookie,和响应头的Set-Cookie对应

Connection:该浏览器想要优先使用的链接类型

Cache-Control:用来指定在这次的请求/响应链中的所有缓存机制都必须遵守的指令

4.状态码,状态码分为5类:

信息响应:100-199

成功响应:200-299

重定向:300-399

客户端错误:400-499

服务器错误:500-500

常见状态码:

100:Continue,继续发送剩余请求

200:OK 成功

302:Found 请求的资源被暂时的移动到了由Location头部指定的URL上,重定向

304:Not Modified 可以使用缓存的内容

400:Bad Request 语法无效

401:缺乏目标资源要求的身份验证凭证

403:拒绝授权访问

404:无法找到请求资源

405:服务器禁止了使用当前HTTP方法的请求

406:服务器无法提供与Accept-Charset以及Accept-Language指定的值相匹配的响应

408:服务器想要将没有在使用的连接关闭

500:服务器出问题了

501:请求的方法不被服务器支持

503:服务器停机维护或超载

5.常见响应头

Date:发送消息的时间

Server:服务器的名字

Expires:超过该时间则认为响应已过期

Content-Type:响应体的类型:

text/html(HTML格式)

text/xml(XML格式)

application/json(json格式,官方)

text/json(json格式,相当于一个广泛的山寨版本)

text/javascript(javascript格式)

text/plain(纯文本格式),image/png(png图片格式)

Access-Control-Allow-Origin:跨域,如果设置*则表示支持所有IP访问

Location:用来进行重定向

Set-Cookie:用来返回一个Cookie让客户端保存