文章目录
1.HTTP协议的介绍
HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议.
所谓 “超文本” 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些其他的资源, 比如图片, 视频, 音频等二进制的数据. |
---|
我们把数据从A端传送到B端, TCP/IP 解决的是主机之间通信的功能,而两端还要对数据进行加工处理或者使用,所以我们还需要一层协议,不关心通信细节,关心应用细节这层协议叫做应用层协议而应用是有不同的场景的,所以应用层协议是有不同种类的,其中经典协议之一的HTTP就是其中的佼佼者. |
---|
2. HTTP 协议的工作过程
当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应.
- 客户端: 主动发起网络请求的一端
- 服务器: 被动接收网络请求的一端
- 请求: 客户端给服务器发送的数据
- 响应: 服务器给客户端返回的数据
事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP 请求/响应 的交互过程
注意: 当前百度主页 是通过 https 来进行通信的. https 是在 http 基础之上做了一个加密解密的工作。
3.HTTP 协议格式
我们来抓取百度首页的 HTTP 请求,抓取到的结果如下
完整的HTTP请求
首行: [方法] + [url] + [版本] | |
---|---|
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束 | |
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有 | |
一个Content-Length属性来标识Body的长度; |
完整的HTTP响应
首行: [方法] + [url] + [版本] | |
---|---|
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分 | |
结束 | |
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有 | |
一个Content-Length属性来标识Body的长度; |
Fiddler 相当于一个 “代理”. | |
---|---|
浏览器访问 baidu.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 baidu 的服务器. | |
当 baidu 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器.因此 Fiddler 对于浏览器和 baidu服务器之间交互的数据细节, 都是非常清楚的 | |
存在空行的原因: | |
因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 “报头的结束标记”, 或者是 “报头和正文之间的分隔符”.HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 “粘包问题”. |
格式总结
4.HTTP 请求 (Request)
4.1认识URL
- URL 基本格式
- 平时我们俗称的 “网址” 其实就是说的 URL (Uniform Resource Locator 统一资源定位符)。
- 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
一个完整的URL
具体的URL:
https://editor.csdn.net/md?not_checkout=1&spm=1000.2115.3001.5352&articleId=125346507 - https : 协议方案名. 常见的有 http 和 https, 也有其他的类型. (例如访问 mysql 时用的
jdbc:mysql ) - user:pass : 登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略
- editor.csdn.net : 服务器地址. 此处是一个 “域名”, 域名会通过 DNS 系统解析成一个具体的 IP 地址.(通过 ping 命令可以看到, editor.csdn.net 的真实 IP 地址为 101.201.178.55 )
- 端口号: 上面的 URL 中端口号被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用 哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口.
- /md : 带层次的文件路径.
- not_checkout=1&spm=1000.2115.3001.5352&articleId=125346507: 查询字符串(query string). 本质是一个键值对结构. 键值对之间使用& 分隔. 键和值之间使用 = 分隔.
*片段标识: 此 URL 中省略了片段标识. 片段标识主要用于页面内跳转
使用 ping 命令查看域名对应的 IP 地址! | |
---|---|
关于 query string | |
---|---|
query string 中的内容是键值对结构. 其中的 key 和 value 的取值和个数, 完全都是程序猿自己约 | |
定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器. |
URL 中的可省略部分 | |
---|---|
协议名: 可以省略, 省略后默认为 http:// | |
ip 地址 / 域名: 在 HTML 中可以省略(比如 img, link, script, a 标签的 src 或者 href 属性). 省 | |
略后表示服务器的 ip / 域名与当前 HTML 所属的 ip / 域名一致. | |
端口号: 可以省略. 省略后如果是 http 协议, 端口号自动设为 80; 如果是 https 协议, 端口号自动设为 443. | |
带层次的文件路径: 可以省略. 省略后相当于 / . 有些服务器会在发现 / 路径的时候自动访问/index.html | |
查询字符串: 可以省略 | |
片段标识: 可以省略 |
URLencode 介绍
4.2认识 “方法” (method)
HTTP 中的方法,就是 HTTP 请求报文中的首行的第一个部分。
虽然 HTTP 中的方法很多,但是最常用的就两个 GET 和 POST。以下主要介绍这两个方法
4.2.1 GET 方法
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.
在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求.
GET 请求的特点:
- 首行的第一部分为 GET
- URL 的 query string 可以为空, 也可以不为空.
- header 部分有若干个键值对结构.
- body 部分为空.
4.2.2 POST 方法
POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).
通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript 的 ajax 也可以构造 POST 请求
POST 请求的特点
- 首行的第一部分为 POST
- URL 的 query string 一般为空 (也可以不为空)
- header 部分有若干个键值对结构.
- body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由
- header 中的 Content-Length 指定.
4.2.3 GET 和 POST 的区别
语义不同: GET 一般用于获取数据, POST 一般用于提交数据. | |
---|---|
GET 的 body 一般为空, 需要传递的数据通过 query string 传递, POST 的 query string 一般 | |
GET 请求一般是幂等的, POST 请求一般是不幂等的. (如果多次请求得到的结果一样, 就视为请求是幂等的). | |
GET 可以被缓存, POST 不能被缓存. (这一点也是承接幂等性). | |
补充说明 | |
关于语义: GET 完全可以用于提交数据, POST 也完全可以用于获取数据. | |
关于幂等性: 标准建议 GET 实现为幂等的. | |
关于安全性: 有些资料上说 “POST 比 GET 请安全”. 这样的说法是不科学的. 是否安全取决于 | |
前端在传输密码等敏感信息时是否进行加密, 和 GET POST 无关. | |
关于传输数据量: 有的资料上说 “GET 传输的数据量小, POST 传输数据量大”. 这个也是不科学的, 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少, 完全取决于不同浏览器和不同服务器之间的实现区别. |
4.2.3 其他方法
PUT 与 POST 相似,只是具有幂等特性,一般用于更新 | |
---|---|
DELETE 删除服务器指定资源 | |
OPTIONS 返回服务器所支持的请求方法 | |
HEAD 类似于GET,只不过响应体不返回,只返回响应头 | |
TRACE 回显服务器端收到的请求,测试的时候会用到这个 | |
CONNECT 预留,暂无使用 |
这些方法的 HTTP 请求可以使用 ajax 来构造. (也可以通过一些第三方工具)
5.认识请求 “报头” (header)
header 的整体的格式也是 “键值对” 结构。
每个键值对占一行. 键和值之间使用分号分割。
Host :表示服务器主机的地址和端口. | |
---|---|
Content-Length:表示 body 中的数据长度. | |
Content-Type:表示请求的 body 中的数据格式. |
5.1 User-Agent (简称 UA)
表示浏览器/操作系统的属性
5.2 Referer
表示这个页面是从哪个页面跳转过来的:
如果直接在浏览器中输入URL, 或者直接通过收藏夹访问页面时是没有 Referer 的.
5.3 登录过程
6.HTTP 响应详解
6.1认识 “状态码” (status code)
状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的一些情况…).
常见的状态码:
200 OK:访问成功 | |
---|---|
404 Not Found :没有找到资源 | |
404 Not Found :没有找到资源 | |
403 Forbidden :表示访问被拒绝. 有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆直接访问, 就容易见到 403. | |
405 Method Not Allowed :HTTP 中所支持的方法, 有 GET, POST, PUT, DELETE 等.但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法). | |
500 Internal Server Error :当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况或者代码出错. | |
302 Move temporarily : 临时重定向. | |
301 Moved Permanently :永久重定向. 当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址. |
6.2 认识响应“报头”(header)
响应报头的基本格式和请求报头的格式基本一致.
类似于 Content-Type , Content-Length 等属性的含义也和请求中的含义一致.
Content-Type
响应中的 Content-Type 常见取值有以下几种:
text/html : body 数据格式是 HTML | |
---|---|
text/css : body 数据格式是 CSS | |
application/javascript : body 数据格式是 JavaScript | |
application/json : body 数据格式是 JSON |
6.3认识响应 “正文” (body)
text/html:表示数据格式是 HTML | |
---|---|
text/css:表示数据格式是 CSS | |
application/javascript:表示数据各式是 JavaScript | |
application/json:表示数据格式是 JSON |