HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。html
HTTP 协议是以 ASCII 码传输,创建在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。相似于下面这样:python
<method> <request-URL> <version> <headers>
<entity-body>
HTTP定义了与服务器交互的不一样方法,最基本的方法有4种,分别是GET
,POST
,PUT
,DELETE
。URL
全称是资源描述符,咱们能够这样认为:一个URL
地址,它用于描述一个网络上的资源,而 HTTP 中的GET
,POST
,PUT
,DELETE
就对应着对这个资源的查,增,改,删4个操做。浏览器
1. GET:安全
GET请求报文示例:服务器
GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive
POST表示可能修改变服务器上的资源的请求。网络
POST / HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive sex=man&name=Professional
咱们知道 HTTP 协议采用“请求-应答”模式,当使用普通模式,即非 Keep-Alive 模式时,每一个请求/应答客户和服务器都要新建一个链接,完成以后当即断开链接(HTTP协议为无链接的协议);当使用 Keep-Alive 模式(又称持久链接、链接重用)时,Keep-Alive 功能使客户端到服务器端的链接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了创建或者从新创建链接。app
HTTP Keep-Alive 简单说就是保持当前的TCP链接,避免了从新创建链接。编码
HTTP 长链接不可能一直保持,例如 Keep-Alive: timeout=5, max=100
,表示这个TCP通道能够保持5秒,max=100,表示这个长链接最多接收100次请求就断开。url
HTTP是一个无状态协议,这意味着每一个请求都是独立的,Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的链接必定是活跃的,在HTTP1.1版本中也如此。惟一能保证的就是当链接被关闭时你能获得一个通知,因此不该该让程序依赖于Keep-Alive的保持链接特性,不然会有意想不到的后果。code
使用长链接以后,客户端、服务端怎么知道本次传输结束呢?两部分:1. 判断传输数据是否达到了Content-Length 指示的大小;2. 动态生成的文件没有 Content-Length ,它是分块传输(chunked),这时候就要根据 chunked 编码来判断,chunked 编码的数据在最后有一个空 chunked 块,代表本次传输数据结束,详见这里。什么是 chunked 分块传输呢?下面咱们就来介绍
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操做
4xx:客户端错误--请求有语法错误或请求没法实现
5xx:服务器端错误--服务器未能实现合法的请求
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经受权,这个状态代码必须和WWW-Authenticate报头域一块儿使用
403 Forbidden //服务器收到请求,可是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
urllib 和urllib2之间的区别是:
在python2中,urllib和urllib2都是接受URL请求的相关模块,可是提供了不一样的功能。两个最显著的不一样以下:
一、urllib2能够接受一个Request类的实例来设置URL请求的headers
2urllib仅能够接受URL。这意味着,你不能够假装你的User Agent字符串等。
可是urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是就是为什么urllib常和urllib2一块儿使用的缘由。
python urllib2直接open和经过request再open有什么区别。
http://zhuoqiang.me/python-urllib2-usage.html
HTTP容许传输任意类型的数据对象