HTTP
2020-04-12 本文已影响0人
球丁丁
一. 服务器与浏览器的交互
- 浏览器负责发送请求
- 服务器在 80 端口接收请求
- 服务器负责返回内容(响应)
- 浏览器负责下载响应内容
二. HTTP协议
超文本传输协议(HTTP),指导浏览器和服务器之间通信的应用层协议
HTTP协议的版本
(1)HTTP/1.0
- 客户端与web服务器建立TCP连接后,每个连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接
- 有GET 、POST 和HEAD方法
(2)HTTP/1.1(现使用版本)
- 客户端与WEB服务器建立连接后,在一个连接上可以获取多个WEB资源。
- GET 、POST 、HEAD、PUT、PATCH、OPTIONS、DELETE等方法
- 同一个TCP连接里,所有的数据通信按次序进行。服务器只能顺序处理,可能造成多个请求排队,造成"队头堵塞"。
- 避免队头堵塞,可以采用两种方法,一是减少请求数,二是同时多开持久连接
(3)HTTP/2.0
- 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“
- 允许服务器未经请求,主动向客户端发送资源,即服务器推送
三. HTTP请求方法
1、POST
- 向指定的资源提交要被处理的数据,在请求体中向服务器发送请求数据
- 提交的数据理论上讲是没有大小限制,HTTP协议规范也没有进行大小限制,但实际上POST 所能传递的数据量大小取决于服务器的设置和内存大小,一般不超过2M
- 数据类型没有限制
- POST 请求不会被缓存、不会保留在浏览器历史记录中、不能被收藏为书签
2、GET
- 通过URL请求指定的资源,请求数据在URL中对所有人可见,使用 GET 的请求应该只用于获取数据
- 传输的数据一般不能超过2K,实际上,URL不存在参数上限的问题,这个限制是特定的浏览器及服务器对它的限制
- 数据类型只允许 ASCII 字符。
- GET 请求可被缓存、可被收藏为书签、会保留在浏览器历史记录中
3、HEAD
- 与 GET 相同,但只返回 HTTP 报头,不返回文档主体
- 一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载,以此可以节约带宽资源
4、PUT
- 使用请求中的负载创建或者替换目标资源
- PUT方法是幂等的,调用一次与连续调用多次是等价的(即没有副作用)
5、DELETE
- 删除指定资源
四. HTTP请求
1. http请求的一个例子
POST / HTTP/1.1
Host: www.xxx.com
User-Agent: curl/7.54.0
Accept: */*
qqq: xxx
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
1234567890
2. http请求参数
- 1 动词 路径 协议/版本
2 Key1: value1
2 Key2: value2
2 Key3: value3
2 Content-Type: application/x-www-form-urlencoded
2 Host: www.xxx.com
2 User-Agent: curl/7.54.0
3
4 要上传的数据 - 请求最多包含四部分,最少包含三部分。(也就是说第四部分可以为空)
- 第三部分永远都是一个回车
- 这里的路径包括「查询参数」,但不包括「锚点」,如果没有写路径,那么路径默认为 /
- User-Agent:产生请求的用户代理信息(浏览器信息)
- Accept:客户端可识别的内容类型
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
- 第 2 部分中的 Content-Type 标注了第 4 部分的格式
- 常见的 Content-Type
text/html HTML格式
text/plain 纯文本格式
text/css CSS格式
text/javascript JavaScript格式
application/x-www-form-urlencoded 是常用的表单发包方式,提交的单数据会转换为键值对并按照 key1=val1&key2=val2 的方式进行编码
multipart/form-data 常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctype 等于这个值
application/json JSON数据格式
application/xml XML数据格式
五. HTTP响应
1. http响应的一个例子
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2443
Content-Type: text/html
Date: Tue, 10 Oct 2017 09:14:05 GMT
Last-Modified: Mon, 23 Jan 2019 13:24:45 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com;
path=/
<!DOCTYPE html>
<!--STATUS OK--><html> <head> 后面太长,省略了……
2. http响应参数
- 1 协议/版本号 状态码 状态解释
- 2 Key1: value1
2 Key2: value2
2 Content-Length: 17931
2 Content-Type: text/html - 3
- 4 要下载的内容
- 第 2 部分中的 Content-Type 标注了第 4 部分的格式
2. http响应状态码
(1)概述
- 1** :信息,服务器收到请求,需要请求者继续执行操作
- 2** :成功,操作被成功接收并处理
- 3** :重定向,需要进一步的操作以完成请求
- 4** :客户端错误,请求包含语法错误或无法完成请求
- 5** :服务器错误,服务器在处理请求的过程中发生了错误
(2)常见
- 100: 信息型状态响应码表示目前为止一切正常, 客户端应该继续请求
- 200:请求成功
- 202 :请求已经接收到,但还未响应,没有结果
- 300:被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息,用户或浏览器能够自行选择一个首选的地址进行重定向
- 301:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一
- 302:请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的
- 400:语义有误,当前请求无法被服务器理解,除非进行修改,否则客户端不应该重复提交这个请求;请求参数有误。
- 401: 当前请求需要用户验证
- 403:服务器已经理解请求,但是拒绝执行它
- 404:请求失败,请求所希望得到的资源未被在服务器上发现
- 408:请求超时
- 500:服务器遇到了不知道如何处理的情况
- 502:此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应
- 504:当服务器作为网关,不能及时得到响应时返回此错误代码
参考资料
- MDN
- 个人笔记