目录
HTTP协议
1.HTTP是什么?
2.Fiddler抓包查看HTTP协议格式
3.HTTP请求
4.HTTP响应
HTTP协议
1.HTTP是什么?
- 当我们在浏览器中输入一个 搜狗搜索的 "网址" (URL) 时, 浏览器就给搜狗的服务器发送了一个 HTTP 请求, 搜狗的服务器返回了一个 HTTP 响应.
- 这个响应结果被浏览器解析之后, 就展示成我们看到的页面内容. (这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片, 字体等信息).
- 所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些其他的资源, 比如图片, 视频, 音频等二进制的数据
前面我已经分享过TCP/IP协议的运行机制,主要是通过IP+Port(地址+端口号)来解决数据在客户端和服务器之间传输路径选择的问题,当我们把数据从A点传输到B点,还需要保证A,B双方都能对数据准确解读,以保证双方对数据的正常使用,这时我们就需要应用层协议了,这也是HTTP协议主要做的事。
2.Fiddler抓包查看HTTP协议格式
Fidder是开发者常用的抓包工具,用来获取HTTP请求和响应。
Fiddler 相当于一个 "代理". 浏览器访问 sogou.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 sogou 的服务器. 当 sogou 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器. 因此 Fiddler 对于浏览器和 sogou 服务器之间交互的数据细节, 都是非常清楚的.
下图所示便是Fiddler的主页面:
我们能清楚的看到HTTP请求和响应的格式
请求格式:
- 首行: [方法] + [url] + [版本]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度;
响应格式:
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.
http协议中的空行用来表示请求报头的结束标记。相当于报头和正文的分隔符。
3.HTTP请求
请求方法(Method)
- GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。
- POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面)。
- PUT 与 POST 相似,只是具有幂等特性,一般用于更新。
- DELETE 删除服务器指定资源。
- OPTIONS 返回服务器所支持的请求方法。
- HEAD 类似于GET,只不过响应体不返回,只返回响应头。
- TRACE 回显服务器端收到的请求,测试的时候会用到这个。
- CONNECT 预留,暂无使用。
URL的基本格式
URL 的详细规则由因特网标准RFC1738进行了约定,如下所示:
但是实际上具体的URL网址对有些信息进行了省略。
https://v.baidu.com/personInf/student?userId=10000&classId=100
上面是一个具体的URL网址信息。
- https: 协议方案名. 常见的有 http 和 https, 也有其他的类型. (例如访问 mysql 时用的 jdbc:mysql )。
- user:pass: 登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略。
- v.baidudu.com: 服务器地址. 此处是一个 "域名", 域名会通过 DNS 系统解析成一个具体的 IP 地址。
- 端口号: 上面的 URL 中端口号被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口。
- /personInf/student: 带层次的文件路径。
- userId=10000&classId=100: 查询字符串(query string). 本质是一个键值对结构. 键值对之间使 用 & 分隔. 键和值之间使用 = 分隔.
- 片段标识: 此 URL 中省略了片段标识. 片段标识主要用于页面内跳转。
在URL中像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
请求报头(header)
下面介绍一些常见的报头种类和含义:
- Host:表示服务器主机的地址和端口。
- Content-Length:表示 body 中的数据长度。
- Content-Type:表示请求的 body 中的数据格式。
- User-Agent (简称 UA):表示浏览器/操作系统的属性。
- Referer:表示这个页面是从哪个页面跳转过来的。
- Cookie:Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据)。
4.HTTP响应
响应状态码
- 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 :临时重定向. 在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页. 响应报文的 header 部分会包含一个 Location 字段, 表示要跳转到哪个页面.
- 301 Moved Permanently :永久重定向. 当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.301 也是通过 Location 字段来表示要重定向到的新地址.
在网上看到过一幅很形象概括HTTP状态码的图:
响应报头(header)
- text/html : body 数据格式是 HTML
- text/css : body 数据格式是 CSS
- application/javascript : body 数据格式是 JavaScript
- application/json : body 数据格式是 JSON