简介
- 超文本传输协议(HTTP,HyperText Transfer Protocol)是一种应用层协议。rfc2616文档定义了HTTP/1.1版本,目前广泛被使用。
- HTTP协议通信默认建立在TCP协议之上,一般一个HTTP server在传输层上开放端口是80
请求方法
- OPTIONS:查询服务器的性能或者请求资源的需求
- GET:请求获取Request-URI所标识的资源
- 当请求体不携带数据时,请求报文的格式如下:
GET /test HTTP/1.1 Host: 112.124.40.1x User-Agent: PostmanRuntime/7.26.3 Accept: */* Accept-Encoding: gzip, deflate, br Postman-Token: f0b537a9-ec3a-4b55-9fd3-4e849663b589
- 当请求体以form-data形式携带数据时,请求报文的格式如下
GET /test HTTP/1.1 Host: 112.124.40.1x User-Agent: PostmanRuntime/7.26.3 Content-Length: 266 Accept: */* Accept-Encoding: gzip, deflate, br Content-Type: multipart/form-data; boundary=--------------------------503095490044683101881136 Postman-Token: 45ed2b17-0096-449d-9aba-25d1866eaab6 ----------------------------503095490044683101881136 Content-Disposition: form-data; name="name" nrv ----------------------------503095490044683101881136 Content-Disposition: form-data; name="age" 24 ----------------------------503095490044683101881136--
- 当请求体以x-www-form-urlencoded形式携带数据时,请求报文的格式如下
GET /test HTTP/1.1 Host: 112.124.40.1x User-Agent: PostmanRuntime/7.26.3 Content-Length: 15 Accept: */* Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded Postman-Token: 86a3016b-a00b-4a10-b7f6-0a2544afb50f name=nrv&age=24
- HEAD:请求获取由Request-URI所标识的资源的响应头
- POST:在Request-URI所标识的资源后增加新的数据
- 当请求体以form-data形式携带数据时,请求报文的格式如下
POST /test HTTP/1.1 Host: 112.124.40.1x User-Agent: PostmanRuntime/7.26.3 Content-Length: 266 Accept: */* Accept-Encoding: gzip, deflate, br Content-Type: multipart/form-data; boundary=--------------------------250868630620014304134458 Postman-Token: ac61dab9-57bd-420e-adea-66ad24f55bd2 ----------------------------250868630620014304134458 Content-Disposition: form-data; name="name" nrv ----------------------------250868630620014304134458 Content-Disposition: form-data; name="age" 24 ----------------------------250868630620014304134458--
- 当请求体以x-www-form-urlencoded形式携带数据时,请求报文的格式如下
POST /test HTTP/1.1 Host: 112.124.40.1x User-Agent: PostmanRuntime/7.26.3 Content-Length: 15 Accept: */* Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded Postman-Token: c7159c3f-2d7d-45f9-b56e-dc23802609a0 name=nrv&age=24
- PUT:请求服务器添加或修改一个资源,并用Request-URI作为其标识
- DELETE:请求服务器删除Request-URI所标识的资源
- TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
- CONNECT:保留给可以动态切换为隧道的代理使用
状态码
- 1xx:表示请求收到,正在处理中
- 2xx:表示请求成功处理
- 3xx:表示需要进行附加操作才能完成请求
- 4xx:表示客户端错误,不能处理客户端请求
- 5xx:表示服务端错误,处理请求出错
请求报文
请求报文由请求行、请求头、请求空行、请求体四个部分组成
1.请求行
- 请求行格式为
请求方法名 空格 请求URI 空格 HTTP协议版本 CRLF
- 示例如下:其中请求方法为POST,HTTP协议版本为HTTP/1.1
POST /api/4/envelope/?sentry_key=423672e28e394864b3bb81271a8d538f&sentry_version=7&sentry_client=sentry.javascript.angular-ivy%2F7.112.2 HTTP/1.1
2.请求头
- 请求头格式如下
字段名: 字段值 CRLF
...
字段名: 字段值 CRLF
- 示例如下:
Accept: */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 487
Content-Type: text/plain;charset=UTF-8
Host: client-report.zsxq.com
Origin: https://wx.zsxq.com
3.请求空行
- 请求空行由回车换行符组成
4.请求体
- 如果请求体不为空的话,请求体包含向服务端发送的请求数据
响应报文
1.响应行
- 响应行格式为
协议版本 空格 状态码 空格 状态码描述 CRLF
- 示例如下:其中HTTP协议版本为HTTP/1.1,状态码为200,表示成功响应
HTTP/1.1 200 OK
2.响应头
- 响应头格式如下
字段名: 字段值 CRLF
...
字段名: 字段值 CRLF
- 示例如下:
Server: nginx
Date: Sun, 28 Apr 2024 15:03:02 GMT
Content-Type: application/json
Content-Length: 2
Connection: keep-alive
3.响应空行
响应空行由回车换行符组成
4.响应体
如果响应头中存在Content-Length字段,且大于0,则响应体包含向客户端发送的响应数据
常见的请求头字段
- User-Agent:用于标识HTTP client的身份信息,可以根据不同的HTTP客户端使用的浏览器不同,响应不同的数据
- Referer字段:告诉服务器当前请求从哪里来。这个字段的作用是防盗链以及执行一些统计工作
- Content-Length:指定请求体的大小
- Host:指定请求资源的IP地址和端口号
- Accept-Encoding:指定允许接收的编码格式,常用的值有gzip、deflate、br
常见的响应头字段
- Content-Type:服务器告诉客户端本次响应数据格式及编码格式,例如
text/plain;charset=UTF-8
- Content-disposition:服务器告诉客户端以什么格式打开响应体数据。其默认值有in-line表示在当前页面内打开,
attachment;filename=xxx;
以附件形式打开响应体,一般用于文件下载 - Content-Length:指定响应体的大小
- Content-Encoding:指定响应体的编码格式
- Connection:值有两种,close和keep-alive。close表示通知消息发送方响应数据后就关闭连接,keep-alive表示建立长连接。
- Transfer-Encoding:常见值为chunked,通知对端数据是分块传输的
特点
- 无状态:为了保持HTTP协议的简单性,HTTP协议本身不会对通信状态进行持久化处理。然而,在许多应用场景中,需要保持用户登录的状态或记录用户购物车中的商品。由于HTTP是无状态协议,所以必须引入一些技术来记录管理状态,例如Cookie。在请求头中会存在一个字段Cookie,维护着某种状态信息。
- 无连接:服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。在HTTP1.0版本中每一次请求响应都会建立新的连接,即请求头的Connection字段值为close;在HTTP1.1版本中对连接进行复用,将请求头的Connection字段值设置为Keep-Alive实现长连接。
问题:get和post请求方法的区别:
- 在实际应用中,GET请求方法通常会将向服务端发送的数据放在URI后,以问号分割URI和传输的数据,参数之间以&符号相连。发送的数据会出现在请求报文的请求行中;POST方法通常将提交的数据放在HTTP包的请求体中。
- GET提交的数据大小有限制(因为浏览器的输入框或者服务端解析请求报文对URL的长度有限制),而POST方法提交的数据没有限制。