HTTP协议
一、HTTP协议介绍
所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是⼀些其 他的资源,比如图片、视频、音频等⼆进制的数据。
理解“应用层协议”
我们平时打开⼀个网站,就是通过 HTTP 协议来传输数据的。
理解 HTTP 协议的工作过程
事实上, 当我们访问⼀个网站的时候,可能涉及不止一次的 HTTP 请求/响应 的交互过程。
二、HTTP协议格式
Fiddler的下载地址: https://www.telerik.com/fiddler/
我们打开Fiddler,并且在浏览器中访问 www.baidu.com,这时我们就可以看到Fiddler中显示的HTTP请求/响应。
- 左侧窗口显示了所有的 HTTP请求/响应,可以选中某个请求双击查看详情。
- 右侧上方显示了 HTTP 请求的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
- 右侧下方显示了 HTTP 响应的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
- 请求和响应的详细数据,可以通过右下角的 View in Notepad 通过记事本打开
抓包工具的原理
Fiddler 相当于⼀个 "代理"。浏览器访问 www.baidu.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 Baidu 的服务 器,当Baidu服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器。
1、HTTP协议请求报文格式
1、首行:方法+URL+版本
2、请求头部(Header): 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔,遇到空行表示请求头部分结束。
3、空行:空行表示请求头部分结束。
4、请求正文(body):http的载荷部分,有的http请求报文没有正文部分。空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个 Content-Length属性来标识Body的长度。
2、 HTTP协议响应报文格式
- 首行: [版本号] + [状态码] + [状态码解释]
- 响应头部Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- 空行:空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个 Content-Length属性来标识Body的长度; 如果服务器返回了⼀个html页面, 那么html页面内容就是在body中。
为什么 HTTP 报文中要存在 "空行"?因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 "报头的结束标记", 或者是 "报头和正文之间的分隔符".HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 "粘包问题"。
3、协议格式总结
三、认识URL
1、URL 基本格式
举例:
https://v.bitedu.vip/personInf/student?userId=10000&classId=100
- https : 协议方案名。常见的有 http 和 https, 也有其他的类型. (例如访问 mysql 时用的jdbc:mysql )
- user:pass : 登陆信息. 现在的网站进行身份认证⼀般不再通过 URL 进行了. ⼀般都会省略
- v.bitedu.vip : 服务器地址. 此处是⼀个 "域名", 域名会通过 DNS 系统解析成⼀个具体的 IP 地址
- 端口号: 上面的 URL 中端口号被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口. 例如 http 协议默认使用80端口,https 协议默认使用443端口.
-
/personInf/student : 带层次的文件路径.
-
userId=10000&classId=100 : 查询字符串(query string). 本质是⼀个键值对结构. 键值对之间使用 & 分隔,键和值之间使用=分隔
-
片段标识: 此 URL 中省略了片段标识. 片段标识主要用于页面内跳转.
query string 中的内容是键值对结构. 其中的 key 和 value 的取值和个数, 完全都是程序猿自己约定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器.
2、URL encode
⼀个中文字符由 UTF-8 或者 GBK 这样的编码方式构成, 虽然在 URL 中没有特殊含义, 但是仍然需要进行转义. 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号.
例如:我们在百度搜索C++时,URL中的“+”就被转义为“%2B"。
四、认识“方法”
1. GET 方法
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。
以下情况会触发 GET 请求:
在浏览器中直接输入 URL, 此时浏览器就会发送出⼀个 GET 请求 另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求 使用 JavaScript 中的 ajax 也能构造 GET 请求
GET 请求的特点:
- 首行的第⼀部分为 GET
- URL 的 query string 可以为空, 也可以不为空.
- header 部分有若干个键值对结构.
- body 部分一般为空.
GET请求示例:访问百度
2. POST 方法
POST 方法也是⼀种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面)。
通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript 的 ajax 也可以构造 POST 请求.
- 首行的第⼀部分为 POST
- URL 的 query string ⼀般为空 (也可以不为空)
- header 部分有若干个键值对结构
-
body 部分⼀般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由 header 中的 Content-Length 指定.
POST请求示例:登录QQ邮箱
谈谈 GET 和 POST 的区别:
3. 其他方法
- PUT 与 POST 相似,只是具有幂等特性,⼀般用于更新
- DELETE 删除服务器指定资源
- OPTIONS 返回服务器所支持的请求方法
- HEAD 类似于GET,只不过响应体不返回,只返回响应头
- TRACE 回显服务器端收到的请求,测试的时候会用到这个
- CONNECT 预留,暂无使用
五、认识请求 "报头" (header)
1、 Host
2、Content-Length
表示body 中的数据长度.
3、Content-Type
-
application/x-www-form-urlencoded: form 表单提交的数据格式. 此时 body 的格式形如:
title=test&content=hello
-
multipart/form-data: form 表单提交的数据格式(在 form 标签中加上enctyped="multipart/form-data" . 通常用于提交图片/文件. body 格式形如:
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3Trw
------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="text"title------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="file"; filename="chrome.png"Content-Type: image/pngPNG ... content of chrome.png ...------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
- application/json: 数据为 json 格式. body 格式形如:
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
4、User-Agent (简称 UA)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
5、Referer
6、Cookie
每个不同的域名下都可以有不同的 Cookie, 不同网站之间的 Cookie 并不冲突.
对Cookie的补充:
六、 认识 "状态码"
状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的⼀些情况...)
以下为常见的状态码:
- 200 OK
这是⼀个最常见的状态码, 表示访问成功. 抓包抓到的大部分结果都是 200。
- 404 Not Found
没有找到资源。
浏览器输入⼀个 URL, 目的就是为了访问对方服务器上的⼀个资源. 如果这个 URL 标识的资源不存在, 那么就会出现 404
- 403 Forbidden
表示访问被拒绝. 有的页面通常需要用户具有⼀定的权限才能访问(登陆后才能访问). 如果用户没有登陆直接访问, 就容易看到 403
- 405 Method Not Allowed
我们知道 HTTP 中所支持的方法, 有 GET, POST, PUT, DELETE 等.
但是对方的服务器不⼀定都支持所有的方法(或者不允许用户使用⼀些其他的方法).
- 500 Internal Server Error
服务器出现内部错误. ⼀般是服务器的代码执性过程中遇到了⼀些特殊情况(服务器异常崩溃)会产生这个状态码.
- 504 Gateway Timeout
当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况. ( 这种情况在双⼗⼀等场景中容易出现, 平时不太容易见到. )
- 302 Move temporarily :临时重定向.
理解 "重定向"
就相当于手机号码中的 "呼叫转移" 功能.例 如我本来的手机号是 12345, 后来换了个新号码 67890, 那么不需要让我的朋友知道新号码,只要我去办理⼀个呼叫转移业务, 其他人拨打 12345 , 就会自动转移到 6780上.
在登陆页面中经常会见到 302。用于实现登陆成功后自动跳转到主页. 响应报文的 header 部分会包含⼀个 Location 字段, 表示要跳转到哪个页面。
- 301 Moved Permanently:永久重定向.
当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.
301 也是通过 Location 字段来表示要重定向到的新地址.
状态码小结:
七、认识响应 "报头"
1、Content-Type
- text/html : body 数据格式是 HTML
- text/css : body 数据格式是 CSS
- application/javascript : body 数据格式是 JavaScript
- application/json : body 数据格式是 JSON
关于HTTP协议的内容就先介绍到这里了,希望能帮到你!
上一篇: 快速创建文件夹下的 vue 项目,构建 vue 框架的详细步骤
下一篇: Ansible - 详细
推荐阅读
-
STM32 I2C 通信协议详解
-
常见 TCP/IP 协议基础知识 - 计算机网络
-
超文本传输协议 HTTP - II.HTTP 报文
-
探索 JavaScript 中的 AbortController API:不仅仅是中断 HTTP 请求
-
传输层协议 UDP 解说
-
Qzone 协议访客签名 q_sig 参数分析
-
Nodejs 使用 http 模块创建网络服务器,以接收和解析 RFID 读卡器的卡数据。
-
快速充电协议的未来前景
-
②PROFINET 至 EtherNet/IP、EtherCAT/Ethernet/IP/Profinet/ModbusTCP 协议交换工业串行网关
-
面试问题 - 请告诉我们 rpc 和 http 的区别,以及 http 能否取代 kafka。