HTTP 协议
应用层协议是程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。
在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至 关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输 超文本(如 HTML 文档)。
HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求(response),服务器收到请求后处理并返回响应(resquest)。HTTP 协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。
http协议是基于TCP的协议
URL
平时我们俗称的 "网址" 其实就是说的 URL
urlencode(URL 编码) 和 urldecode(URL 解码)
像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了. 因此这些字符不能随意出现.
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义. 转义的规则如下: 将需要转码的字符转为 16 进制,然后从右到左,取 4 位(不足 4 位直接处理),每 2 位做一位,前面加上%,编码成%XY 格式
总结:将用户请求的中的字符转为符合 URL 传输要求的格式
urlencode
"hello world!" → "hello+world%21"
"价格=100" → "%E4%BB%B7%E6%A0%BC%3D100"
urldecode
"hello+world%21" → "hello world!"
"%E4%BB%B7%E6%A0%BC%3D100" → "价格=100"
例如:
"+" 被转义成了 "%2B"
urldecode 就是 urlencode 的逆过程;
HTTP 协议请求与响应格式
HTTP 请求
- 首行: [方法] + [url] + [版本]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\r\n 分隔;遇到空行表示 Header 部分结束
- Body: 空行后面的内容都是 Body. Body 允许为空字符串.
- 如果 Body 存在, 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度;
HTTP 响应
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\r\n 分隔;遇到空行表示 Header 部分结束
- Body: 空行后面的内容都是 Body. Body 允许为空字符串.
- 如果 Body 存在, 则在 Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了一 个 html 页面, 那么 html 页面内容就是在 body 中.
demo1:一个http的请求和应答