1、HTTP协议介绍
HTTP协议是Hyper Text Transfer Protocol
(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本(也可以说是资源)到本地浏览器的传送协议。
HTTP协议是基于TCP协议的应用层协议,它不关心数据在底层传输的细节(底层细节需要很多网络方面的知识,这里不扩展说明),主要是用来规定客户端和服务端的数据传输格式(就是定义一种标准),默认端口是80。
http是基于请求与响应模式的、无状态的、应用层的协议。
2、使用Fiddler抓取一个请求
开启Fiddler工具,在浏览器中发送一个HTTP请求,之后在Fiddler中就会抓取到该请求。
双击抓取的请求链接,在右侧窗口就会显示出该请求的请求报文和响应报文内容,如下图:
我们也可以一个请求保存到本地,
选中该HTTP请求,点击右键 —> Save —> Selected Sessions —> as Text...
把该HTTP请求的请求报文和响应报文存储到一个text文件中。
===========请求报文:也就是客户端发给服务器的数据=============
GET http://127.0.0.1:8000/api/departments/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
=========响应报文:=======================
HTTP/1.0 200 OK
Date: Wed, 13 Jan 2021 14:59:00 GMT
Server: WSGIServer/0.2 CPython/3.5.4
Vary: Cookie
Content-Type: application/json
Content-Length: 1789
X-Frame-Options: SAMEORIGIN
Allow: GET, POST, DELETE
{
"count":3,
"next":null,
"previous":null,
"results":[
{
"dep_id":"T02",
"dep_name":"Java_2学院",
"master_name":"Java-Master",
"slogan":"java"
},
{
"dep_id":"T03",
"dep_name":"Java_3学院",
"master_name":"Java-Master",
"slogan":"java"
},
{
"dep_id":"T04",
"dep_name":"C++/学院",
"master_name":"C++-Master",
"slogan":"Here is Slogan"
}
]
}
3、НТТP请求报文
(1)НТТP请求报文说明
HTTP请求报文主要由请求行、请求头部、空一行、请求正文4部分组成。
请求正文也可以说成请求体,请求体可能有如Get请求,也可能没有如POST请求。
HTTP请求报文协议格式:
在Fiddler中抓取的请求中,在请求头部信息中,点击raw选项就可以看到如下信息。
下面一一说明:
(2)请求行
请求行分为三部分:
-
请求方法:Request Method
请求方法 备注 GET 请求资源 POST 提交资源 Head 获取响应头 PUT 替换资源 DELETE 删除资源 OPTIONS 允许客户端查看服务器的性能 TRACE 回显服务器收的请求,用于测试或诊断 -
统一资源标识符
名称:
Uniform Resource Locator
:统一资源定位符。
作用:用于描述网上的资源。格式:
schema://host[:port#]/path/.../[?query-string]
说明:
schema
:协议,如http,https,ftp等。host
:域名或者IP地址。
port
:端口。
path
:资源路径。
query-string
:发送的参数。
例如:https://www.baidu.com/s?ie=UTF-8&wd=图片
HTТP协议版本:
HTTP/1.1
是现在比较常用的版本。
(3)请求头(Request Header)
常见请求头属性如下:
-
Host
所请求web服务器的IP地址或域名:例:
www.baidu.com
。 -
User-Agent
HTTP客户端运行的浏览器类型,详情。
后台可以根据该头部信息,判断当前的HTTP请求的客户端浏览器类型.
例如:
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
-
Accept
指定客户端能够接受的内容类型,内容类型的先后顺序表示客户端接受的先后顺序。
比如:
Accept:text/html,application/xml
-
Accept-Charset
客户端接受的字符集,如
gb2312
,iso-8859-1
-
Accept-Encoding
指定客户端浏览器可以支持的web服务器返回内容压缩编码类型,
允许服务器在将输入内容发送到客户端以前进行压缩,
以节约带宽,节省传输时间,提交传输效率。
比如:
Accept-Encoding:gzip,deflate
-
Accept-Language
指定HTTP客户端浏览器用来展示返回信息所先选择的语言。
也就是指定客户端接收的语言。
比如:
Accept-Language:zh-cn,zh;q=0.5
后面的q表示权重。 -
Cookie
http请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。
-
Referer
包含一个url,用户从该url的页面触发访问当前请求的页面。
即从哪个链接过来的。(可以做统计和防止盗链)
-
Content-Type
显示此HHTP请求提交的内容类型。
比如:
Content-Type:application/x-www-form-urlencoded;charset:UTF-8
"application/x-www-form-urlencoded"
是浏览器的默认值,表示表单数据向服务器提交时所采用的编码类型。 -
Content-Length
用于描述HTTP消息实体的传输长度。
需要注意的是:在HTTP协议中,消息实体的长度和消息实体的传输长度是有区别的。
比如说gzip压缩下,消息实体长度是压缩前的长度,但是消息实体的传输长度是gzip压缩后的长度。
-
Connection
表示是否需要持久连接。比如:
Connection:keep-Alive
-
X-Requested-With
用来判断客户端的请求是Ajax请求(异步)还是其他请求(同步)。
后台可以利用request.getHeader("x-requested-with")为null判断是同步请求,为XMLHttpRequest则是Ajax异步请求。
例:X-Requested-With:XMLHttpRequest。
-
Origin
跨域的时候,get,post都会显示origin,同域的时候get不显示origin,post显示origin。
Authorization:客户端提供服务端,进行权限认证的信息。
Cache-Control:缓存机制,如
Cache-Control:no-cache
。Pragma:防止页面被缓存,和
Cache-Control:no-cache
作用一样。
(4)请求体
就是请求需要携带的数据。没什么可说的,有就显示。