第 1 章 浏览器生成消息——探索浏览器内部
1.1 生成 HTTP 请求消息
1.1.1 网址
- 网址:准确来说应该叫
URL
,Uniform Resource Locator,统一资源定位符 - 域名:就是像 www.glasscom.com 这样以句点(.)分隔的名称
尽管 URL 有各种不同的写法,但它们有一个共同点,那就是 URL 开头的文字,即“http:”“ftp:”“file:”“mailto:”这部分文字都表示浏览器应当使用的访问方法。比如当访问 Web 服务器时应该使用 HTTP 协议,而访问 FTP 服务器时则应该使用 FTP 协议。因此,我们可以把这部分理解为访问时使用的协议类型 。尽管后面部分的写法各不相同,但开头部分的内容决定了后面部分的写法,
1.1.2 浏览器先要解析 URL
浏览器要做的第一步工作就是对 URL 进行解析
1.1.3 省略文件名的情况
(a)http://www.lab.glasscom.com/dir/
- 以“/”结尾代表 /dir/ 后面本来应该有的文件名被省略了
- 会在服务器上事先设置好文件名省略时要访问的默认文件名。这个设置根据服务器不同而不同,大多数情况下是 index.html 或者 default.htm 之类的文件名。
- 因此,像前面这样省略文件名时,服务器就会访问 /dir/index.html 或者 /dir/default.html
(b)http://www.lab.glasscom.com/
- 这个 URL 也是以“/”结尾的,也就是说它表示访问一个名叫“/”的目录
- 由于省略了文件名,所以结果就是访问 /index.html 或者 /default.htm 这样的文件
(c)http://www.lab.glasscom.com
- 当没有路径名时,就代表访问根目录下事先设置的默认文件 ,也就是/index.html 或者 /default.htm 这些文件
(d)http://www.lab.glasscom.com/whatisthis
- 如果 Web 服务器上存在名为 whatisthis 的 文件,则将 whatisthis 作为文件名来处理;如果存在名为whatisthis 的目录,则将 whatisthis 作为目录名来处理
- 我们无法创建两个名字相同的文件和目录,因此不可能既有一个名为 whatisthis 的文件,同时又有一个名为 whatisthis的目录。只要查询一 下磁盘中的文件和目录,就可以知道 whatisthis 究竟是一个文件还是一个目录了,并不会产生歧义。
1.1.4 HTTP 的基本思路
HTTP 的主要方法:
- 最常用的一个就是 GET 方法了。一般当我们访问 Web 服务器获取网页数据时,使用的就是 GET 方法。所谓一般的访问过程大概就是这样的:首先,在请求消息中写上 GET 方法,然后在 URI 中写上存放网页数据的文件名“/dir1/file1.html”,这就表示我们需要获取 /dir1/file1.html 文件中的数据。当 Web 服务器收到消息后,会打开 /dir1/file1.html 文件并读取出里面的数据,然后将读出的数据存放到响应消息中,并返回给客户端。最后,客户端浏览器会收到这些数据并显示在屏幕上。
- 还有一个经常使用的方法就是 POST。我们在表单 中填写数据并将其发送给 Web 服务器时就会使用这个方法。当我们在网上商城填写收货地址和姓名,或者是在网上填写问卷时,都会遇到带有输入框的网页,而这些可以输入信息的部分就是表单。使用 POST 方法时,URI 会指向 Web 服务器中运行的一个应用程序的文件名,典型的例子包括“index.cgi”“index.php”等。然后,在请求消息中,除了方法和 URI 之外,还要加上传递给应用程序和脚本的数据。这里的数据也就是用户在输入框里填写的信息。当服务器收到消息后,Web 服务器会将请求消息中的数据发送给 URI 指定的应用程序。最后,Web 服务器从应用程序接收输出的结果,会将它存放到响应消息中并返回给客户端。
1.1.5 生成 HTTP 请求消息
消息体的格式会通过消息头中的 Content-Type 字段来定义(MIME 类型)
- 写好方法之后,加一个空格,然后写 URI。URI 部分的格式如下,一般是文件和程序的路径名。
/< 目录名 >/…/< 文件名 > - 第一行的末尾需要写上 HTTP 的版本号,这是为了表示该消息是基于哪个版本的 HTTP 规格编写的
- 第二行开始为消息头。尽管通过第一行我们就可以大致理解请求的内容,但有些情况下还需要一些额外的详细信息,而消息头的功能就是用来存放这些信息。消息头的规格中定义了很多项目,如日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等。这些项目表示的都是非常细节的信息。
HTTP 中主要的头字段
GET 方法能够发送的数据只有几百个字节,如果表单中的数据超过这一长度,则必须使用 POST 方法来发送。
- 当使用 POST 方法时,需要将表单中填写的信息写在消息体中。到此为止,请求消息的生成操作就全部完成了。
1.1.6 发送请求后会收到响应
响应消息的格式以及基本思路和请求消息是相同的,差别只在第一行上,在响应消息中,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错。状态码和响应短语表示的内容一致,但它们的用途不同。状态码是一个数字,它主要用来向程序告知执行的结果,响应短语则是一段文字,用来向人们告知执行的结果。