前言
任何一个http请求
都只会分为两个部分: 一个请求报文
另外一个是响应报文
请求报文
是客户端
按照一定的格式生成一段文本,然后发给我们的服务端
, 而服务器
接收到了这样一个请求报文
就会解析里面的内容,然后做出回馈,也就是响应
响应报文
也就是服务器端
根据请求报文
反馈给客户端
的文本信息
HTTP请求报文 (request)基本结构
http请求(request)
也叫请求报文
一个基本的http请求报文
结构分为如下几点:
请求行
:就是请求方式和协议,也就是说用于描述客户端
的请求方式
,例如post/get
方式, 以及请求的资源名称和HTTP协议
的版本号!若干个请求头
: 这些也叫消息头
告诉服务器发送的是什么数据类型,编码类型、请求的是哪台主机、以及客户端浏览器的一些系统环境
等等, 这些消息头
中有很多头部字段名
和对应的值
它的格式为name:value
空白行
请求正文内容
抓包了解一下
那么我们在学习http
知识的时候 就可以先直接使用Fiddler
来抓取一个http请求
和http响应
来先看看到底是什么东西!
这样也有助于一些新手来理解http
!
我们可以通过Fiddler
抓取网络数据包的手段,就可以看到一个基本的http请求
结构都包含哪些信息!
例如一个GET方式
的请求(Request)
信息 如下:
GET https://www.baidu.com/?name=zhangsan HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
例如一个POST方式
的请求(Request)
信息 如下:
POST https://api.codelife.cc/stat/userHm HTTP/1.1
Host: api.codelife.cc
Connection: keep-alive
Content-Length: 48
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
Content-Type: application/json
Accept: application/json, text/plain, */*
sec-ch-ua-platform: "Windows"
version: 1.2.27
Origin: chrome-extension://mhloojimgilafopcmlcikiidgbbnelip
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
{"fp":"4c49c2fd79e1658546e4b8ad","tn":6}
怎么样 是不是看这一大堆脑壳都大了呢 ? 哈哈哈不要着急,我们慢慢来学!😁😁😁
我们先来看一张请求(Request)
图解
如图
然后我们来逐一拆解
上图中的各个部分!
1.请求方式 (Request method)
我们常见的一些请求方式也就是POST/GET
,当然还有其他的一些请求方式, 如下表:
请求方法 | 描述 |
---|---|
GET |
请求资源 比如常见的就是输入一个URL 去请求一个资源下来, 它也可以带上一定的参数一起请求 |
POST |
提交资源 比如说我们想把用户名和密码 提交到服务器去,这个时候用POST 比较好 |
HEAD |
获取响应头 |
PUT |
替换资源 |
DELETE |
删除资源 |
OPTIONS |
允许客户端查看服务器的性能 |
TRACE |
显示服务器收到的请求 常见于测试和调试诊断! |
2.URL (Uniform Resource Locator)
URL
中文名为统一资源定位符
英文全称Uniform Resource Locator
,
我们网络中的每一信息资源都有统一的且在网上唯一的地址!
URL具体由4部分组成:协议、主机、域名、端口、路径文件、[附加资源]
URL的一般语法格式为:
protocol :// hostname[:port] / path / [?query-parameters]
1.协议 (protocol)
协议有http、ftp、https
、等...
2.主机名 (hostname) + 域名
主机名+域名
例如: www.xsphp.com
3.端口 (port)
端口是一个数字, 端口是可选的 省略时使用方案是服务器默认配置的端口
例如 80、8080、..
各种传输协议
都有默认的端口号,如http协议
的默认端口为80
如果URL地址
省略端口,则使用默认端口号
注意
有时候出于安全或其他考虑,可以在服务器配置上对端口进行重新定义,也就是采用非标准端口号
,那么此时,URL地址
中就不能省略端口号
这一项。
4.路径文件 (path)
由零或多个/
符号隔开的字符串,一般用来表示主机上的一个目录或文件地址
例如: /tpl/index.php
5.查询参数 附加资源 (query-parameters)
这一项在URL
中也是可选的 用于给动态网页如 PHP/JSP/ASP/ASP.NET
等后端页面 传递参数
的一种方式,并且如果是GET
请求方法, 那么可有多个参数, 它们彼此用&
符号隔开,每个参数的名和值用=
符号隔开
语法格式: ?参数=值&参数2=值
以此类推!
例如: ?id=33&age=25&name=zhangsan
举个例子
一个比较常见的url
地址, 如下:
https://www.xxxx.net/xxxx/xxxx/xxxx/100?num=1001.2014.3001.5501
3.请消息求头 (Request Header)
请求消息头
也叫消息头
告诉服务器发送的是什么数据类型,编码类型、请求的是哪台主机、以及客户端浏览器的一些系统环境
等等前面已经说过了, 并且请求头
是可以由开发人员根据需求去进行自定义
的
这些消息头
中有很多头部字段名
和 对应的值
它的格式为 name:value
我们常见的一些请求头
如下表:
请求头 | 描述 | |
---|---|---|
Host |
主机IP地址或域名 | |
User-Agent |
提交一些客户端 相关信息,例如: 操作系统、浏览器 等一些版本信息给服务器 , 而这些信息可能会让服务器 按照一定的规则给客户端 返回兼容性比较好的信息! |
|
Accept |
指定客户端 接收的信息类型,例如: image/jpg,text/html,application/json 也就是可以让 客户端 告诉服务器 之后客户端这一边想接收到什么样的数据格式 |
|
Accept-Charset |
告诉服务器 等一会这边客户端 需要接收的字符集编码格式 , |
例如: gb2312、iso-8859-1、utf-8 |
Accept-Encoding |
告诉服务器 , 客户端这边可接受的内容压缩编码 ,例如gzip 可以在一定程度上节省流量! |
|
Accept-Language |
告诉服务器, 客户端 可接受的语言,例如Accept-Language:zh-cn |
|
Authorization |
客户端提供给服务端进行权限认证的信息, 也就是要告诉服务器端一些认证的信息,服务器才能返回响应的数据! | |
Cookie |
携带的COOKIE信息, 普通情况下,当一个用户登录成功,就会在本地保存一份cookie ,下次请求就会直接带上这个cookie 信息,也就是这个用户的相关信息 |
|
Referer |
当前文档的URL 也就是纪录下从哪个链接地址 提交到服务器 的 |
|
Content-Type |
向服务器 提交内容的格式例如: Content-Type:application/x-www-form-urlencoded 总而言之,就是告诉 服务器 ,客户端 传递的内容属于什么格式 或 其他编码格式! |
|
Content-Length |
数据长度, 也就是客户端 向服务器端 提交内容的数据长度有多少字节! |
|
Cache-Control |
缓存机制,例如:Cache-Control:no-cache |
|
pragma |
防止页面被缓存,与Cache-Control:no-cache 作用一样 |
|
.............................................. |
我们可以用Fiddler
截取一个请求头
看看
如图
4.空行
空白行
也就是在消息头
结束的下方,会存在一个空白行
, 这是必须存在的, 是由HTTP
标准规定的!
5.请求体
请求体
它的出现是要根据请求的方式不同而不同, 也就是如果是POST
那么就会以键与值
的形式进行发送, 如果是GET
请求那么这里就不会包含请求正文内容