HTTP协议的基本格式
什么是HTTP
HTTP(全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议。
HTTP 往往是基于传输层的 TCP 协议实现的,其中HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP实现,这里是主要讨论的是HTTP 以 1.1 版本。
平时所用的网站就是通过HTTP来传输数据。
对于定义的理解:
1.为什么说是超文本: 因为传输的内容不仅可以是文本(html,css),还可以是其他资源(图片,视频,音频等二进制的数据)。
2.HTTP应用层协议的理解:可以把HTTP看作一个快递员,浏览器是发件人,服务器是收件人。快递员需要按照一定的规则来送快递,比如收件人的地址,邮编等,同样HTTP也需要按照一定规则来传输数据,比如请求方法,请求头,请求体等。浏览器向服务器发送请求,等同于发件人把快递给快递员;服务器响应浏览器的请求,就像收件人收到快递。HTTP协议规定了浏览器和服务器之间的数据传输方式,就像快递公司规定了快递员的工作流程。
我们可以通过Fiddler工具来 抓包, 分析 HTTP 请求/响应的细节。
对URL的认识
“网址” 其实就是说的 URL (Uniform Resource Locator 统一资源定位符).互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
一个具体的URL
1.https : 协议方案名. 常见的有 http 和 https, 也有其他的类型. (例如访问 mysql 时用的jdbc:mysql ),可以省略,省略后为http://;
2.user:pass : 登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略;
3www.baidu.com : 服务器地址. 此处是一个 “域名”, 域名会通过 DNS 系统解析成一个具体的 IP 地址.
4.端口号: 上面的 URL 中端口号被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口,可以省略.
5./sugrec : 带层次的文件路径,可以省略,省略后为/;
6.&prod=pc_his&from=pc_web… : 查询字符串(query string). 本质是一个键值对结构. 键值对之间使用& 分隔. 键和值之间使用 = 分隔;
7.片段标识: 此 URL 中省略了片段标识. 片段标识主要用于页面内跳转,可以省略.
关于query string
对于query string:query string 中的内容是键值对结构. 其中的 key 和 value 的取值和个数, 完全可以通过我们自己的约定决定. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器.
例如:点个蛋炒饭外卖,外卖上备注不要葱,转成HTTP格式就是:
http://ip:port/蛋炒饭?葱=不要
后面的葱=不要就是一对query string
关于 URL encode
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
“+” 被转义成了 “%2B”
HTTP请求
1.GET方法
GET是最常用的HTTP方法,常用于获取服务器上的某个资源,在服务器中直接输入URL,此时浏览器就会发送一个GET请求,另外HTML中的link,img,script等标签,也会触发GET请求。
利用抓包工具,观察GET请求
红框就是浏览器发送的GET请求
选中红框查看详细的请求结果
GET请求的特点:
1.首行的第一部分为GET
2.URL的query string可以为空,也可以不为空
a.这里的query string为空
b.这里的query string不为空
3.header部分若干个键值对结构(下图为部分)
4.body部分为空
2.POST方法
POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用JavaScript 的 ajax 也可以构造 POST 请求.
利用抓包工具,观察POST请求
红框就是浏览器发送的POST请求
选中红框查看详细的请求结果
POST 请求的特点
1.首行的第一部分为 POST
2.URL 的 query string 一般为空 (也可以不为空)
这里query string 为空
3.header 部分有若干个键值对结构.(下图为部分)
4.body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由header 中的Content-Length 指定.
body部分
其他方法(了解)
PUT 与 POST 相似,只是具有幂等特性,一般用于更新
DELETE 删除服务器指定资源
OPTIONS 返回服务器所支持的请求方法
HEAD 类似于GET,只不过响应体不返回,只返回响应头
TRACE 回显服务器端收到的请求,测试的时候会用到这个
CONNECT 预留,暂无使用
HTTP响应
1.“状态码” (status code):状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的一些情况…)
200 OK:这是一个最常见的状态码, 表示访问成功
访问百度页面的抓包结果
404 Not Found:没有找到资源
访问百度页面的抓包结果
403 Forbidden:表示访问被拒绝. 有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆直接访问, 就容易见到 403
下面是抓包结果
405 Method Not Allowed: HTTP 中所支持的方法, 有 GET, POST, PUT, DELETE 等,但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法).
500 Internal Server Error:服务器出现内部错误. 一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码
504 Gateway Timeout:当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况.
比如双十一秒杀的时候
302 Move temporarily:临时重定向…响应报文的 header 部分会包含一个 Location 字段, 表示要跳转到哪个页面.
以下是抓包结果
301 Moved Permanently:永久重定向. 当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.301 也是通过 Location 字段来表示要重定向到的新地址.
小结: