3、早期地HTTP请求只能由浏览器刷新网页发起,是同步的,现在有了Ajax,可以发起异步的HTTP请求
URL与URI
无论HTTP协议如何发展,它的基本核心没有变,即HTTP协议是一种请求应答机制的协议,它需要请求一个远程服务器上的某个资源,早期是网页HTML,现在更多是接口JSON数据,但是无论资源如何变化,该资源都要有一个URL标识它在网络中的位置。
URL的组成
URL组成包括:协议,服务器地址,服务器端口号,资源唯一标识,请求参数,锚点,以及它们之间的分隔符
通过URL就可以确定网络中唯一的资源所在位置。
我们通常也将URL称为网址。
那么URI又是什么呢?
URI(Uniform Resource Identifier)统一资源标识符,它是用来定义唯一资源的。即使用一种定义方式让资源唯一。
那么上面的网址是不是可以标识一个唯一资源呢?
答案是可以的。所以URL也是一种特殊的URI。
但是URI还有很多其他表达方式,不一定要写出URL形式。
URI和URL的关系,就像父类和子类一样。子类是一种特殊的父类。URL也是一种特殊的URI。
HTTP协议的报文结构
HTTP协议将报文分为了请求报文和响应报文
HTTP请求报文结构
HTTP请求报文由四部分组成,从上到下依次是:请求行,请求头,空行,请求体
请求行(必传):组成包括请求方法(如POST),请求资源标识(如/api/login),HTTP协议版本(如HTTP/1.1)
请求头(必传):其中都是key:value键值对形式,主要是描述请求相关的信息,如请求的服务器地址,请求体的格式,编码方式,期望服务器响应的报文的格式和编码方式,请求发起方所在的浏览器内核信息,以及操作系统信息,以及一些控制网络连接的设置,
空行(必传):主要用来分隔报文首部和报文主体,请求行和请求头可以看出报文首部,请求体可以看出报文主题。
请求体(可选):请求消息体,即报文的主体内容,可以不传,看业务需求
HTTP响应报文结构
HTTP响应报文也由四部分组成,从上到下依次是:响应行,响应头,空行,响应体
响应行(必传):也叫状态行,用来概括本次响应的状态,组成包括:HTTP协议版本(如HTTP/1.1),状态码(如200),状态码描述(如OK)
响应头(必传):由key:value键值对组成,主要用来描述本次响应的一些信息,如服务器应用程序提供者(如Tomcat,Express,Nginx),是否允许跨域(Acess-Control-Allow-Origin),以及响应体的格式和编码方式(Content-Type),连接设置(Connection),连接失效时间(Keep-Alive)
响应体(可选):即响应消息体,是响应报文的主体内容,其中包含请求方所需的业务数据,但是不是必传的,可以根据业务需求决定。
HTTP请求方法
在HTTP请求报文的请求行中开头就是请求方法,常用的有GET,POST,还有一些不常用,一共有八个
GET | 获取资源,通常不带有报文体内容,它还是默认HTTP请求方法 |
POST | 提交请求,带有报文体的请求 |
OPTIONS | 查询服务器指定资源支持的请求方法 |
HEAD | 和GET类似,但是不返回报文体 |
PUT | 向服务器上传资源,存在安全问题 |
DELETE | 删除服务器上的资源,存在安全问题 |
TRACE | 让服务器将之前的请求通信返回给客户端 |
CONNECT | 用来建立传输通道 |
当前开发过程主要使用GET和POST,其他方式很少在开发中使用。
GET请求方法
GET请求方法的作用是 获取 && 检索。
“获取”性质的GET,通常不需要携带请求参数。
“检索”性质的GET,通常需要携带请求参数。
但是GET请求通常不会将请求参数放到请求体中,而是直接拼接在请求URL中。
URL中默认只支持部分ASCII码表中的字符,如常见的英文字母、数字、常用的英文符号。
这是因为URL是西方人设计出来的,他们只考虑了自己的语言环境,使用ASCII码表字符就完全够了。所以URL中如果出现中文字符,那么URL就无法工作了。因为ASCII码表中没有中文字符。
而GET请求参数出现中文字符的场景是很多的,比如常见的百度搜索,我们不可能将想要搜索的中文翻译为英文后搜索。
所以就引入了编码技术,通过将中文字符encode为ASCII码字符,就解决了URL无法识别中文字符的问题了。
我们知道ASCII码表只有128个字符,但是中文字符却有上万个,而中文字符编码后还需要能够适配只识别ASCII码的环境,比如URL。所以新的编码技术顺其自然的通过ASCII码表字符间不同的组合,来一一对应一个中文字符。
比如中文字符编码:GBK
当然除了中文,还有日文,韩文,罗马文,各种国家的文字,他们都需要在网络上传输,那么就需要一种基于ASCII码字符组合兼容万国文字的编码:UTF-8
可以看出GBK表示一个中文字符只需要两个字节
D6D0 为啥是两个字节
一个字节 = 8位 二进制数
0000 0000 ~ 1111 1111
而 4位二进制数,等价于 1位十六进制数
0000 ~ 1111 = 0 ~ F
所以 8位 二进制数,等价于 2位 16进制数
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
学习分享,共勉
题外话,毕竟我工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
助,可以添加下面V无偿领取!(备注:前端)**
[外链图片转存中…(img-whGaTPOw-1711027235712)]
学习分享,共勉
题外话,毕竟我工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心