文章目录
背景
HTTP处于TCP/IP五层协议的栈的应用层。(全称为 “超文本传输协议”)
HTTP自身的扩展性强,可以让程序员传输各种自定义信息。
日常使用HTTP的场景:
用浏览器打开网站
打开某些手机APP
协议格式(数据具体怎么组织的)
HTTP为文本格式的协议,可以通过 Chrome 开发者工具或者 Fiddler 等抓包工具来抓包, 分析 HTTP 请求/响应的细节。
抓包工具
在网络通讯中相当于
“代理”
。
当浏览器访问一个网站时,先把HTTP请求发给抓包工具,抓包工具再把请求转发给网站的服务器;当服务器返回HTTP响应数据时,先把数据返回给抓包工具,抓包工具在转发给浏览器。
HTTP请求
请求格式:
1、首行(方法、URL、版本号)
2、header(若干行,每一行都是一组键值对)
3、空行(表示header内容结束)
4、正文(body包含的数据内容)
方法
最常用的两种:GET 和 POST
GET
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.
首行的第一部分为 GET
URL 的 query string
( 下面有解释)可以为空, 也可以不为空.
header 部分有若干个键值对结构.
body 部分为空.
关于 GET 请求的 URL 长度问题
网上有些资料上描述: get请求长度最多1024kb 这样的说法是错误的.
HTTP 协议由 RFC 2616 标准定义, 标准原文中明确说明: “Hypertext Transfer Protocol –
HTTP/1.1,” does not specify any requirement for URL length.
没有对 URL 的长度有任何的限制.
实际 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现. 在浏览器端, 不同的浏览器最大长度是不同的, 但是现代浏览器支持的长度一般都很长; 在服务器端, 一般这个长度是可以配置的.
POST
POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).
首行的第一部分为 POST
URL 的 query string 一般为空 (也可以不为空)
header 部分有若干个键值对结构.
body 部分一般不为空. body 内的数据格式通过 header 中的Content-Type 指定.
body 的长度由header 中的 Content-Length 指定.
经典面试题: 谈谈 GET 和 POST 的区别
语义不同: GET 一般用于获取数据, POST 一般用于提交数据.
GET 的 body 一般为空, 需要传递的数据通过 query string 传递, POST 的 query string 一般为空, 需要传递的数据通过 body 传递。
GET 请求一般是幂等的, POST 请求一般是不幂等的. (如果多次请求得到的结果一样, 就视为请求是幂等的).
GET 可以被缓存, POST 不能被缓存. (这一点也是承接幂等性).
补充说明:
关于语义: GET 完全可以用于提交数据, POST 也完全可以用于获取数据.
关于幂等性: 标准建议 GET 实现为幂等的. 实际开发中 GET 也不必完全遵守这个规则(主流网站都有 “猜你喜欢” 功能, 会根据用户的历史行为实时更新现有的结果.
关于安全性: 有些资料上说 “POST 比 GET 请安全”. 这样的说法是不科学的.是否安全取决于前端在传输密码等敏感信息时是否进行加密, 和 GET POST 无关.
关于传输数据量: 有的资料上说 “GET传输的数据量小, POST 传输数据量大”. 这个也是不科学的, 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少,完全取决于不同浏览器和不同服务器之间的实现区别.
关于传输数据类型: 有的资料上说 “GET 只能传输文本数据, POST 可以传输二进制数据”. 这个也是不科学的. GET 的 query string 虽然无法直接传输二进制数据, 但是可以针对二进制数据进行url encode
.
url encode
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.
转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
URL
URL:“网络上唯一资源地址符” (明确主机是谁和取主机上哪些内容)
登录信息现在已过时一般省略
服务器地址:要访问的的主机,可以是ip地址,可以是域名。
端口号:要访问主机上哪个程序;大部分情况下会省略端口号,一般看到的不是真实的端口号,因为浏览器会自动赋值(http:80 https:4)。
带层次文件路径:描述了当前要访问的服务器资源是什么。
查询字符串(query string
):query string 中的内容是键值对结构. 其中的 key 和 value 的取值和个数, 完全都是程序猿自己约定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器。
片段标识符:描述了访问当前html哪些具体的部分,能够将浏览器滚动到相关的位置。
header
header 的整体的格式也是 "键值对"
结构.
每个键值对占一行. 键和值之间使用分号分割.
Host
表示服务器主机的地址和端口.
Content-Length
表示 body 中的数据长度.
Content-Type
表示请求的 body 中的数据格式.
常见选项:
application/x-www-form-urlencoded: form 表单提交的数据格式. 此时 body 的格式形如:
multipart/form-data: form
表单提交的数据格式(在 form 标签中加上
enctyped="multipart/form-data" .
通常用于提交图片/文件. body 格式形如:
Content-Type:multipart/form-data; boundary=----
WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name=“text”
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name=“file”;
Content-Type: image/png
PNG … content of chrome.png …
------WebKitFormBoundaryrGKCBY7qhFd3TrwA–
application/json: 数据为 json 格式. body 格式形如:
{“username”:“123456789”,“password”:“xxxx”,“code”:“jw7l”,“uuid”:“d110a05ccde64b16a861fa2bddfdcd15”}
User-Agent (简称 UA)
表示浏览器/操作系统的属性.
Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/91.0.4472.77 Safari/537.36
其中 Windows NT 10.0; Win64; x64
表示操作系统信息
AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.77Safari/537.36
表示浏览器信息.
Referer
表示这个页面是从哪个页面跳转过来的.
如果直接在浏览器中输入URL, 或者直接通过收藏夹访问页面时是没有 Referer 的.
Cookie
Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据).
HTTP响应
状态码(status code)
200 OK 这是一个最常见的状态码, 表示访问成功.
404 Not Found 没有找到资源
403 Forbidden 表示访问被拒绝. 有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆直接访问, 就容易见到 403.
405 Method Not Allowed 不支持的方法
500 Internal Server Error 服务器出现问题
504 Gateway Timeout 服务器繁忙
302 Move temporarily 临时重定向
301 Moved Permanently 永久重定向.
重定向:
相当于手机中的呼叫转移
访问某个网页自动跳转到其他网页