HTTP即超文本传输协议(Hyper Text Transfer Protocol),工作在应用层,用于服务器与客户端之间的数据传输。
特点
分为请求报文和响应报文。
请求报文
是客户端发送给服务器的报文,由请求行、请求头、请求体构成。
响应报文
是服务器返回给客户端的报文,由响应行、响应头、响应体构成。
记录了识别报文类型最基本的信息。
出现在在请求报文首行,标识请求的方法。
GET
POST
其他请求
设计初衷是用不同的方法来表示不同的语义,但是现在大多数请求都由GET和POST来完成,下面的方法几乎不再使用。
假设我们要向www.baidu.com发送一个POST,参数是a=1。
使用HTML构造form报文
其实就是在页面上添加一个表单和输入框。
//可以直接用HTML写一个,此处用JS构造
//构造form表单
var form = document.createElement("form")
form.action = "www.baidu.com" //设置目标URL
form.mathod = "POST" //设置请求类型,form的mathod默认是POST
//构造数据,可构造多个数据
var input = document.createElement("input") //构造输入框,用来输入数据
input.name = "a" //参数名,对应键值对的key
input.value = 1 //参数值,对应键值对的value
//连接和发送
form.appendChild(input) //将数据添加到表单
document.body.appendChild(form) //将表单添加到页面
form.submit() //提交表单,发送POST请求
使用JavaScript发送Ajax构造POST请求
Ajax就是通过异步的JavaScript请求来加载和更新部分网页,就是用http请求来实现的。
//使用原生DOM
const xhr = new XHLHttpRequest()
xhr.open("POST", "www.baidu.com")
xhr.send("a=1&b=2")
//后面用来设置响应处理,此处省略
//使用JQuery
//第二个参数是一个js对象,用来存储发送的数据
//第三个参数是响应的处理函数,此处省略
$.post("www.baidu.com", {"a":1})
使用抓包工具
抓包工具可以提供更专业的网络包处理过程。常见的抓包工具有BurpSuite、fiddler、Charles等。详见各软件使用教程。
出现在在请求报文首行,标识请求的URL。
http://host[:port]/path/filename[?query&key=value][#anchor]
http://
表示使用http协议。host
表示访问的主机,可以是域名或者IP地址,例如www.baidu.com或127.0.0.1。:port
表示访问的端口,用来区分具体的应用。默认是80端口,即web应用。/path/filename
表示访问的路径,由目录和文件构成。该路径是虚拟路径,不一定对应现实的文件。默认是访问根目录/
。?query&key=value
表示参数,以?
开始,到#
之前,一般以键值对形式出现。有多个参数的,用&
分隔。也有用;
分隔的。#anchor
表示锚,用于标识访问的网页的位置。默认从顶部访问。出现在报文首行,标识使用的http协议版本。
HTTP1.O
HTTP1.1
HTTP2.0
分为普通报头、请求报头、响应报头、主体报头。由许多的键值对构成,用于标识报文的属性。
本章介绍一些较为常见的报头,更多细节请访问此链接。
存在于请求或响应中,用于描述报文的通用属性,与主体中的信息无关。
Cache-Control 缓存控制
用于控制浏览器和服务器的缓存,多个控制标签用逗号分隔。
private
:表示私有缓存,不与其他应用、用户或者代理服务器分享。max-age=N
:表示缓存持续N秒。与Expires相似,但是优先级更高。no-store
:表示不要缓存,用于内容经常变动的场景。no-cache
:表示可以缓存,但使用时要先去服务器验证是否过期。must-revalidate
:表示在max-age=N
范围内,缓存可以使用,超过之后要去服务器验证是否过期。Date 日期:消息产生的时间
Connection 连接状态
用于控制连接是保持(keep-alive)还是关闭(close)。
仅存在于请求报文当中,用于向服务器指定响应的类型。
Accept:用于指定客户端接收的数据类型,用逗号分隔(如gb2312)。不设置则表示接收任意数据类型。
Accept-Charset:用于指定客户端接收的字符集,用逗号分隔。不设置则表示接收任意字符集。
Accept-Encoding:用于指定客户端接收的编码(如gzip.deflate)。不设置则表示接收任意编码。
Accept-Language:用于指定客户端接收的自然语言(如zh-CN或en)。
User-Agent 用户代理
包含操作系统和浏览器的名称和版本,可用来根据浏览器版本设置返回页面的格式、识别爬虫等。但由于这个头可以随意修改,所以用处不太大。
if-Modified-Since:如果在此时间之后修改过,则请求资源。
if-None-Match:就是对应资源的Etag,用于服务器对比并决定是否更新cache。优先级高于if-Modified-Since
。
Cookie:由服务器生成,存储在客户端的数据,常常是认证信息、浏览记录等。
DNT:将该值设置为1表示拒绝网站的跟踪。
Host:表示目标服务器的地址和端口。
Referer:用于标识请求是从哪个网页发起的,可能用于审计、优化缓存或者防盗链。
Pragma:被Cache-Control
代替。
仅存在于响应报文中,用于描述服务器的信息或者指示客户端进行动作。
Location 定位:在响应报头中,当状态码为3XX(重定向)或201时有意义,用于记录重定向的网址。
Server 服务器:在响应报头中,包含服务器信息。
Last-Modified 上次修改:资源上一次修改的时间。
Etag 资源标签:相当于资源的版本号,当资源更新之后,会更新Etag,用于缓存更新时的对比。优先级高于Last-Modified
。
Set-Cookie:服务器向客户端发送的Cookie。
用于描述主体/负载的信息。
Content-Type 数据类型
常见格式 | application开头的多媒体格式 | 其他常见格式 |
---|---|---|
text/html | application/xhtml+xml | 需要在表单中进行文件上传时使用的格式 |
text/plain | application/xml | multipart/form-data |
text/xml | application/atom+xml | POST默认的数据类型 |
image/gif | application/json | application/x-www-form-urlencoded |
image/jpeg | application/pdf | 任意类型二进制流 |
image/png | application/msword | application/octet-stream |
Content-Encoding:用于描述主体的编码。
Content-Language:用于描述主体的自然语言。
Content-length 负载长度:主体的长度。
Expires 过期时间:主体中数据的过期时间,用于控制缓存。是HTTP1.0的产物,被Cache-Control
替代。
Link:
用于资源的预加载,和HTML的<link>
标签相当。
格式:Link: <https://www.baidu.com>; param1=1, <https://www.google.com>; param2="2"
Cookie和Session机制是为了解决HTTP协议无法保存通信状态的问题而提出的。
Cookie
Cookie由服务器生成的文本内容,发送并存储在客户端中。此后每次客户端向服务器发送请求时都会带上Cookie,一般用于身份认证等。
分为持久Cookie和非持久Cookie,存储在硬盘或者内存中。
使用流程:
注意:
Session
Session是存储在服务器端的信息(往往是一个映射关系)。
Session机制往往与Cookie机制一同使用。服务器存储了有关客户端的信息,并生成一个JSESSIONID,通过Cookie发送给客户端。这样,HTTP可以通过传输Cookie来代替复杂的数据传输。
Session也可以脱离Cookie机制使用,即将JSESSIONID放在请求的URL中进行传输。
Session是针对会话的机制,存储在服务器内存中,当服务器端会话结束时,Session即过期。
评论区