HTTP协议详解


一、什么是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的组成
一个具体的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请求头

HTTP请求正文

只有在发送POST请求时才会有请求正文,GET方法并没有请求正文。

HTTP请求报文

HTTP请求体

四、HTTP响应Response

响应报文格式如下图:
在这里插入图片描述
HTTP响应也由三部分组成,包括状态行,响应头,响应体。

状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:

HTTP/1.1 200 OK

HTTP响应状态码

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方法总结

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的区别

  1. 语义不同:GET一般用于获取数据,POST一般用于提交数据
  2. GET 的 body 一般为空,需要传递的数据通过 query string 传递;POST 的 query string 一般为空,需要传递的数据通过 body 传递
  3. GET 请求一般是幂等的,POST 请求一般是不幂等的(幂等:用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用)
  4. 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方法进行了对比。如果你觉得有收获的话,就留下你的👍吧!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怎样让大排不硬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值