深度解秘HTTP通信细节 (8)

总之,基于很多原因,URL设计者将US-ASCII码和其转义序列集成到URL中,通过转义序列,就可以用US-ASCII字符集的有限子集对任意字符或数据进行编码了。

转义的方法:百分号(%)后跟着两个表示ASCII码的十六进制数。

转义法

所以上面在浏览器发送给服务器的URL进行了非“安全字符”编码,也就不奇怪了吧?

url保留及受限的字符

在URL中,当上面的保留字符用在保留用途之外的场合时,需要对URL进行编码。

MIME类型

响应数据中,我们注意到有一个首部:

Content-Type: text/plain; charset=utf-8

互联网上有数千种不同的数据类型,HTTP给每种对象都打上了MIME(Multipurpose Internet Media Extension, 多用途因特网邮件扩展)标签,也就是响应数据中的Content-Type. MIME本来是用在邮件中的,后来被移植到了HTTP中。浏览器从服务器上取回了一个对象时,会去查看MIME类型,从而得知如何处理这种对象,如展示图片,调用声卡播放声音。MIME通过斜杠来标识对象的主类型和其中的特定的子类型,下表中的实体主体是指body部分:

MIME类型

URI/URL/URN

URI(Uniform Resource Identifier, 统一资源标识符)表示服务器资源,URL(Uniform Resource Locator)和URN(Uniform Resource Name, 统一资源名)是URI的具体实现。URI是一个通用的概念,由两个主要的子集URL和URN构成,URL通过位置、URN通过名字来标识资源。

URL定义了资源的位置,表示资源的实际地址,在使用URL的过程中,如果URL背后的资源发生了位置移动,访问者就找不到它了。这个时候就要用到URN了,它给定资源一个名字,无论它移动到哪里,都可以通过这个名字来访问到它,简直完美!

URL通常的格式是:协议方案(scheme)(如 http, ftp,告知web客户端怎样访问资源)+服务器地址(如 )+具体的资源路径(如 index.html)。如:

URL举例

HTTP方法

HTTP支持几种不同的请求方法,每种方法对服务器要求的动作不同,如下图是几种常见的方法:

常见的http方法

HEAD方法只获取头部,不获取数据部分。通过头部可以获取比如资源的类型(Content-Type)、资源的长度(Content-Length)这些信息。

POST用于向服务器发送数据,PUT用于向服务器上的资源存储数据。

状态码

每条HTTP的响应报文都会带上一个三位数字的状态码和一条解释性的“原因短语”,通知客户端本次请求的状态,帮助客户端快速理解事务处理结果,最常见的是:

200 OK 404 Not Found 500 Internal Server Error

我们平时使用浏览器的时候,很多的错误码其实是由浏览器处理的,我们感知不到。但是404 Not Found会穿透重重迷雾,来到我们面前,那是因为他对我们爱的深沉啊!

客户端可以据此状态码,决定下一步的行动(如重定向等)。

三位数字的第一位表示分类:

http状态分类

报文格式

HTTP报文实际上是由一行行的字符串组成的,每行字符串的mowei用\r\n分隔,人类可以很方便的阅读。顺便说一句,不是所有的协议都对人类这么友好的,像thrift协议,直接甩一堆字节给你,告诉你说0x0001表示调用方法,诸如此类的,你只能对着一个十六进制的数据块一个个地去“解码”。

请求报文和响应报文的格式,还可以结合上面的例子:

请求响应报文示例

实际上,请求报文也是可以有body(主体)部分的。请求报文是由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。唯一要注意的一点就是,请求报文即使body部分是空的,请求头部后的回车换行符也是必须要有的。

请求报文格式

响应报文的格式和请求报文的格式类似:

响应报文格式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpywyy.html