一、什么是HTTP?
HTTP协议简介
HTTP协议 :超文本传输协议,是一种应用非常广泛的应用层协议,它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
HTTP协议工作于客户端——服务端架构上,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求,WEB服务器根据接收到的请求后,向客户端发送响应信息。
HTTP协议特点
支持客户/服务器模式 。简单快速 :客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。灵活 :HTTP允许传输任意类型 的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。无连接 :无连接的含义是限制每次连接只处理一个请求 。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。无状态 :HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
二、认识URL
URL基本格式
URL :全称是Uniform Resource Locator, 中文叫统一资源定位符 ,是互联网上用来标识某一处资源的地址。
互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。 一个具体的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 地址(通过 ping 命令可以看到,v.bitedu.vip 的真实 IP 地址为 47.108.71.212 ) 端口号:上面的 URL 中端口号被省略了,当端口号省略的时候,浏览器会根据协议类型自动决定使用哪个端口。例如 http 协议默认使用 80 端口,https 协议默认使用 443 端口 /personInf/student:带层次的文件路径 userId=10000&classId=100:查询字符串(query string),本质是一个键值对结构,键值对之间使用 & 分隔,键和值之间使用 = 分隔 片段标识:此 URL 中省略了片段标识,片段标识主要用于页面内跳转(例如 Vue 官方文档:https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5 ,通过不同的片段标识跳转到文档的不同章节)
URL中可以省略的部分
协议名:可以省略,省略后默认为 http:// IP 地址 / 域名:在 HTML 中可以省略(比如 img,link,script,a 标签的 src 或者 href 属性),省略后表示服务器的 IP / 域名与当前 HTML 所属的 IP / 域名一致 端口号:可以省略,省略后如果是 http 协议,端口号自动设为 80; 如果是 https 协议,端口号自动设为 443 带层次的文件路径:可以省略,省略后相当于 / ,有些服务器会在发现 / 路径的时候自动访问 /index.html 查询字符串:可以省略 片段标识:可以省略
关于 URL encode : 像 / ? : 等这样的字符,已经被url当做特殊意义理解了,因此这些字符不能随意出现,当某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义。
转义的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
例如:下面的 “+” 号被转义成了 “%2B”
三、HTTP请求Request
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。 HTTP请求行 :
请求行由请求Method,URL 字段和HTTP Version三部分构成, 总的来说请求行就是定义了本次请求的请求方式 ,请求的地址 ,以及所遵循的HTTP协议版 本,例如:
GET /example.html HTTP/1.1
HTTP请求头部 :
HTTP请求正文 :
只有在发送POST请求时才会有请求正文,GET方法并没有请求正文。
HTTP请求报文
四、HTTP响应Response
响应报文格式如下图: HTTP响应也由三部分组成,包括状态行,响应头,响应体。
状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:
HTTP/1.1 200 OK
HTTP响应状态码
HTTP常见的几种状态码如下图所示:
总结:
HTTP响应报文
响应 “报头” (header) :
响应中的 Content-Type 常见取值有以下几种:
text/html:body 数据格式是 HTML text/css:body 数据格式是 CSS application/javascript:body 数据格式是 JavaScript application/json:body 数据格式是 JSON
响应 “正文” (body) :
五、认识方法(Method)
HTTP方法总结
为了方便记忆,可以将PUT、DELETE、GET、POST理解为客户端对服务端的增删查改:
PUT:上传文件,向服务器添加数据,可以看作增 DELETE:删除文件,可以看作删 GET:获取资源,查询服务器资源,可以看作查 POST:传输数据,向服务器提交数据,对服务器数据进行更新,可以看作改
GET方法
GET方法 :GET 是最常用的 HTTP 方法,常用于获取服务器上的某个资源 ,在浏览器中直接输入 URL,此时浏览器就会发送出一个 GET 请求。另外,HTML 中的 link,img,script 等标签,也会触发 GET 请求。
GET请求的特点 :
首行的第一部分为 GET URL 的 query string 可以为空, 也可以不为空 header 部分有若干个键值对结构 body 部分为空
关于 GET 请求的 URL 长度问题: HTTP 协议由 RFC 2616 标准定义,标准原文中明确说明:“Hypertext Transfer Protocol --HTTP/1.1,” does not specify any requirement for URL length. 没有对 URL 的长度有任何的限制。 实际 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现。在浏览器端,不同的浏览器最大长度是不同的,但是现代浏览器支持的长度一般都很长;在服务器端,一般这个长度是可以配置的。
POST方法
POST方法:POST 方法也是一种常见的方法,多用于提交用户输入的数据给服务器(例如登陆页面)。通过 HTML 中的 form 标签可以构造 POST 请求,或者使用 JavaScript 的 ajax 也可以构造 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
总结
以上就是今天要讲的内容,本问简单介绍了HTTP协议的相关知识,包括对 URL 的认识、对HTTP协议请求和响应的认识,并且罗列了HTTP的方法,简单的对GET和POST方法进行了对比。如果你觉得有收获的话,就留下你的👍吧!!!