1 前言下图是一个比较简单的互联网的概念模型 它们在我们日常的生活在很常见: 这篇文章所介绍的http协议是我们享用所有网络服务当中应用最为广泛的协议之一,我们日常浏览使用浏览器进行浏览网页、看视频和听音乐等服务都使用http协议进行数据通信. 2 Http的历史Http(Hypertext Transfer Protocal)的中文名称是超文本传输协议,该协议是用来定义如何传输超文本内容的一组通信规约,其中的“超文本”是一种特殊的文本,它具有可以链接到其他的文本的特点,这也是它与其他普通文本的重要区别,这里的“链接”可以理解为我们在网页中进行点击,页面就跳转到其他页面. Http协议的最初是由欧洲核子研究中心的Tim Berners-Lee开发的,他同时也开发了相关连的html以及一个基于文本内容的浏览器,不得不说这货太厉害了. 不久之后Http协议的开发和维护工作就交由IETF,IETF提议并通过Http 1.0 和Http 1.1 标准,当前最新的是Http 2.0,想了解最新的Http 2.0的动态可以登陆 https://http2./ 进行了解; 这篇文章主要对当前还在广泛使用的Http 1.1进行介绍. Http1.1协议定义在rfc2616. 3 Http的定义Http协议所描述的通讯过程概念图如下所示:
在这个概念图中我们可以知道,我们的浏览器向服务器发送请求,服务器处理完成后,将处理的结果以Http Response的形式返回给我们,下面我将通过一个简单的网页访问来介绍Http的一些概念. Http协议通讯的简单场景描述—访问有道词典首页:
同样,我们要获取网络上面的资源获取也不外乎这样的寻找过程,首先,我们得明确出我们想到哪获取我们要的网页,其次,我们得明确的说明获取哪个网页(毕竟一个服务器上的网页辣么的多).为了解决上面两个问题,Http协议规定了Request应该包含这两个信息,perfect!!! 问题完美解决… 为了解释的能够具体一点,我先介绍一下HTTP协议规定的Request格式
HTTP 的Request的具体格式是定义在等号右边表达式中,大家可能对上面的表示方法不熟悉,解释如下:
2 第二行的“*”表示后面括号里面定义的对象出现多次,其实就是可以出现多个请求的报头; 3 “general-header | request-header | entity-header) CRLF”:表示的是请求的报头,内容可以是general-header, request-header或entity-header等三种不同类别的请求头,具体的内容以后解释;括号后面的“CRLF”表示换行,这个表达式的意思是: 每个general-header定义之后应该换行,也就是每一个header需要使用一行; 4 中间的“CRLF”用来分开请求的header和body,这个比较容易理解,毕竟这两个是不同的概念; 5 message: 它是请求的body的部分,用来装载本地将要发给服务器端的数据,例如:博文、图片等; 上面介绍了这么多的基础知识了,让我们实际操作一下, 首先打开自己的浏览器开发工具(F12), 让后在浏览器的地址栏输入:dict.youdao.com,可以看到开发工具的实际请求内容,好多请求啊: 点击众多请求中的第一个,然后可以看到开发工具展开显示请求的详细内容: 这里我们点击”Request Header”旁边的view source按钮,将会看到实际发送的请求内容: 在请求中我们请求的服务器地址记录在Host这个请求报头,而我们请求的具体资源,记录在第一行的“GET / HTTP/1.1”中 这一行包含三类信息,分别对应” request-method request-url http-version”,而我们现在请求的就是首页信息,即请求中的“request-url”为”/”; 2 有道的服务器收到我们的请求后,首先解析请求的内容,发现用户想要的是首页信息,这时服务器就从自己的网站根目录下找到index.html,并将该页面作为结果返回给用户; 用户浏览器收到有道服务器的response,response当中包含response header 和 response body, response header用来表示请求的处理结果,以及request body内容的格式及长度信息,以下是客户端收到的response header:
在response header的第一行中表明本次请求的处理结果,可以看到上面有”OK”的字样,表明本次请求已经被服务器成功处理,这里面的“200”其实是一个状态码,而“OK”其实就是对这个状态码的字面解释,在日常的而开发过程中我们会经常遇到404(Not Found)和500(Internal Error),这些状态码都表明了当前请求被服务器处理的结果,用户可以根据状态码了解请求是否被正确的处理. response body 就是用来包含用户请求的资源内容,例如本次请求的内容就是首页的html内容. 浏览器在判断本次请求成功处理(返回状态码是200)后,根据Response Header中Content-Type了解到response body里面的内容是html文档,所以浏览器html执行引擎将response body里面的内容进行解析和渲染,即最终的页面结果就是我们所看到的: Http协议的特点 3.1 http定义的功能在上面的例子中我们看到了一个普通的Http请求的处理过程,Http标准定义了几种访问服务器的方法,除了上面说描述的”GET”之外,此外还有: 3.2 GET方法GET方法一般用来请求服务器的资源,对服务器的本身的数据没有任何的改变,仅仅将请求需要的页面返回给用户,例如一般的新闻站点,它们提供的服务就是仅供用户浏览. GET请求的格式一般是:
例如你要获取百度的首页,这是请求中的hostname就是百度服务器的地址:www.baidu.com,同时你请求的首页信息,request-url可以是”/”或是”/index.html” 3.3 POST方法POST方法一般是用来向服务器提交表单数据,例如用户的登陆页,用户需要输入自己的用户名和密码等信息. POST请求将用户提交的数据保存在Request Body当中,下面给出一个简单的表单提交页面:
页面是: 当我们在页面填写完信息后,点击提交按钮后,浏览器会将我们的表单内容封装到Request Body当中.
To be continued. |
|