HTTP ====================================== 在讲HTTP之前,我们先讲一下什么是协议 什么是协议 -------------------------------------- 通俗来讲,协议可以理解为约定,比如说下午一到6点,你就知道要下班了,这是因为公司有制度规定6点下班,协议可以很简单,但也可以很复杂,比如语言就是一种很复杂的协议,有大量的词汇代表不同的意思 协议分层 -------------------------------------- 在学HTTP前一定要理解协议分层这个概念,打个比方,打电话,你打开电话,拨通号码,跟需要通话的人建立了连接,然后你说一句话,声音通过话筒由声波信号转换成了电信号,然后电信号通过通讯媒介传输到对方电话,最后通过对方的听筒转化成声波。 声波转换成电信号,最后电信号又转换成声波,这就要遵守一定的协议,比如多少频率转化成多少伏的电压,如果双方协议不一样,转换出来的声音可能就完全不一样了。声波的传输是需要协议,同时双方通话的人也是,比如你是广东人,对方是上海人,两边各讲方言,结果都蒙逼了,然后双方使用一样的协议都讲普通话,OK,这要就可以HAPPY通信了。 .. figure:: /_static/interface/tel.png :width: 15.0cm 在这里,双方通话语言的协议就在声波和电信号转换的协议之上 那为什么要分层呢?这个问题比较好回答,比如如果你跟你老婆打电话,如果不通过声波和电信号之间的转换协议,你声音得多大她才能听到??这是必要情况。还有一种情况,可能不是必要的,但也要分层,这么做的目的是简化实现,降低耦合,大家可以先这么理解,有兴趣的话可以看一些专业书籍。 再看一下下面这个图,可以理解一下为什么要分层(这个图摘自图解TPC/IP) .. figure:: /_static/interface/tel2.png :width: 15.0cm TCP/IP协议 -------------------------------------- 我们先看一下下面的百科介绍,写的比较专业,我来翻译一下:说白了,就是怎么样把你电脑上运行的程序的消息发送给网络上另一个电脑的程序的一系列协议 .. note:: Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。 我们来了看一下下面的图加深理解(这个图也摘自图解TCP/IP) .. figure:: /_static/interface/floors.png :width: 18.0cm HTTP -------------------------------------- 我们在这只需了解一下什么是HTTP,以及一些入门的知识,并不深入讨论,深入讨论半年也说不完 HTTP是什么 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最开始HTTP是为了传输文件产生的,它属于应用层协议,基于传输层TCP协议,但随着互联网的演进,最初的静态文件传输已经演变成动态生成“文件”再传输 HTTP原理比较类似于去小卖铺买东西,你说要一个泡面( ``请求`` ),然后店员给你一个泡面( ``响应`` ),如果商店没有,店员告诉你没有货了( ``404`` ),如果买东西的人太多了,店员懒得给你找,就回复给你小店炸了,没空理你( ``500`` ),再或者,店员干脆懒得理你,回都不回( ``timeout`` ) 或者,商店里有很多种泡面,你得告诉店员要哪一种,然后你说要包装是纸桶装的( ``header`` )泡面 再或者,你在店里办了会员,每次不会花钱就能买东西,然后你到店里后,要把会员卡给店员,店员看一下你是不是会员,是会员了再看你有什么要求( ``cookies`` ) 再再或者,你买的东西比较私密,不想让旁边的人听到,然后你说了只有你和店员知道的暗语( ``加密`` ) 同理HTTP就是你的电脑和服务器电脑通信的,你输入 http://www.baidu.com ,百度的服务器把网页数据返回给你 HTTP方法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 这里只介绍四种常见的,也就是增删改查 * **GET** 查,我需要查点资料 * **POST** 增,我要增加点东西,如向数据库增加记录 * **PUT** 改,修改某一项已经存在的数据的内容 * **DELETE** 删,删除一些数据 但其实在实际使用过程中,程序员们并不严格遵守,大家了解一下就好啦 HTTP状态码 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 首先看一下状态码分类 .. list-table:: :widths: 15 20 20 :header-rows: 1 * - 状态码 - 类别 - 原因短语 * - 1XX - 信息性状态码 - 接收的请求正在处理 * - 2XX - 成功状态码 - 请求正确,处理完毕 * - 3XX - 重定向状态码 - 需要进行附加操作完成请求 * - 4XX - 客户端错误状态码 - 服务器无法处理请求 * - 5XX - 服务器错误状态码 - 服务器处理请求出错 大家对各种状态码先有一个大致了解,至于每组状态码之间有什么细微差别(如400和404),可以看一下这个百科: http://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81 HTTP请求首部 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 首部也就是我们平常见到的HTTP headers,HTTP首部是除了传输数据外的一些额外信息,比如下面这个:: GET /en/latest/ HTTP/1.1 Host: test-study.readthedocs.io Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 DNT: 1 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 Cookie: csrftoken=NdDltTfq4fl3a70u7SrJ4amYJSezAQHK; __utmt=1; __utma=157584191.1561414775.1496201127.1496888218.1496925908.21; __utmb=157584191.1.10.1496925908; __utmc=157584191; __utmz=157584191.1496201127.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) If-None-Match: W/"59380209-24de" If-Modified-Since: Wed, 07 Jun 2017 13:39:21 GMT 下面我们介绍几个比较重要的首部 **Host** 该首部指明了要访问的服务器地址和端口 **Accept** 表示客户端接受哪种类型的数据,如 ``text/html`` 表示客户端希望得到html文本,``image/jpeg`` 表示希望得到图片,`` application/msword`` 表示希望得到word文档 **Content-Type** 表示客户端发送的数据类型,如 ``application/x-www-form-urlencoded`` 表示发送的是表单键对数据, ``application/json`` 表示发送的是序列化后的json数据 **Cookie** 表示客户端存储的Cookie发送给服务器