关于python:05HTTP协议万字好文建议收藏

45次阅读

共计 10598 个字符,预计需要花费 27 分钟才能阅读完成。

HTTP 协定介绍

设计 HTTP(HyperText Transfer Protocol)是为了提供一种公布和接管 HTML(HyperText Markup Language)页面的办法

Http 组成

由两局部组成:申请与响应

客户端申请音讯

客户端发送一个 HTTP 申请到服务器的申请音讯包含以下格局:申请行(request line)、申请头部(header)、空行和申请数据四个局部组成,下图给出了申请报文的个别格局。

服务器响应音讯

HTTP 响应也由四个局部组成,别离是:状态行、消息报头、空行和响应注释。


先看 Request 音讯的构造, Request 音讯分为 3 局部,第一局部叫 Request line, 第二局部叫 Request header, 第三局部是 body. header 和 body 之间有个空行,构造如下图

形象的货色,难以了解,老感觉是虚的,所谓眼见为实, 理论见到的货色,咱们能力了解和记忆。咱们明天用 Fiddler,理论的看看 Request 和 Response.

上面咱们关上 Fiddler 捕获一个博客园登录的 Request 而后剖析下它的构造, 在 Inspectors tab 下以 Raw 的形式能够看到残缺的 Request 的音讯,

咱们再看 Response 音讯的构造, 和 Request 音讯的构造根本一样。同样也分为三局部, 第一局部叫 Response line, 第二局部叫 Response header,第三局部是 body. header 和 body 之间也有个空行, 构造如下图

HTTP/version-number 示意 HTTP 协定的版本号,status-code 和 message 请看下节 [状态代码] 的具体解释.

咱们用 Fiddler 捕获一个博客园首页的 Response 而后剖析下它的构造, 在 Inspectors tab 下以 Raw 的形式能够看到残缺的 Response 的音讯,如下图


提出一个问题

服务器和客户端的交互仅限于申请 / 响应过程,完结之后便断开,在下一次申请服务器会认为新的客户端;

为了保护他们之间的链接,让服务器晓得这是前一个用户发送的申请,必须在一个中央保留客户端的信息,

  • Cookie 通过在客户端记录信息确定用户身份
  • Session 通过在服务器端记录信息确定用户身份

HTTP 申请


  • 申请办法

依据 HTTP 规范,HTTP 申请能够应用多种申请办法。

HTTP1.0 定义了三种申请办法:GET, POST 和 HEAD 办法。

HTTP1.1 新增了五种申请办法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 办法。

序号 办法 形容
1 GET 申请指定的页面信息,并返回实体主体。
2 HEAD 相似于 get 申请,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行解决申请(例如提交表单或者上传文件)。数据被蕴含在申请体中。POST 申请可能会导致新的资源的建设和 / 或已有资源的批改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 申请服务器删除指定的页面。
6 CONNECT HTTP/1.1 协定中预留给可能将连贯改为管道形式的代理服务器。
7 OPTIONS 容许客户端查看服务器的性能。
8 TRACE 回显服务器收到的申请,次要用于测试或诊断。

GET 和 POST 办法区别归纳如下几点:

  • GET 是从服务器上获取数据,POST 是向服务器传送数据。
  • GET 申请参数显示,都显示在浏览器网址上,POST 申请参数在申请体当中, 音讯长度没有限度而且以隐式的形式进行发送
  • 尽量避免应用 Get 形式提交表单,因为有可能会导致平安问题。比如说在登陆表单中用 Get 形式,用户输出的用户名和明码将在地址栏中暴露无遗。然而在分页程序中,用 Get 形式就比用 Post 好。

Http 协定定义了很多与服务器交互的办法,最根本的有 4 种,别离是 GET,POST,PUT,DELETE. 一个 URL 地址用于形容一个网络上的资源,而 HTTP 中的 GET, POST, PUT, DELETE 就对应着对这个资源的查,改,增,删 4 个操作。咱们最常见的就是 GET 和 POST 了。GET 个别用于获取 / 查问资源信息,而 POST 个别用于更新资源信息.

咱们看看 GET 和 POST 的区别

  1. GET 提交的数据会放在 URL 之后,以? 宰割 URL 和传输数据,参数之间以 & 相连,如 EditPosts.aspx?name=test1&id=123456. POST 办法是把提交的数据放在 HTTP 包的 Body 中.
  2. GET 提交的数据大小有限度(因为浏览器对 URL 的长度有限度),而 POST 办法提交的数据没有限度.
  3. GET 形式须要应用 Request.QueryString 来获得变量的值,而 POST 形式通过 Request.Form 来获取变量的值。
  4. GET 形式提交数据,会带来平安问题,比方一个登录页面,通过 GET 形式提交数据时,用户名和明码将呈现在 URL 上,如果页面能够被缓存或者其他人能够拜访这台机器,就能够从历史记录取得该用户的账号和明码.

URL 概述

对立资源定位符(URL,英语 Uniform / Universal Resource Locator 的缩写)是用于残缺地形容 Internet 上网页和其余资源的地址的一种标识办法。

URL 格局:

根本格局如下 schema://host[:port#]/path/…/?query-string

  • schema 协定(例如:http, https, ftp)
  • host 服务器的 IP 地址或者域名
  • port# 服务器的端口(如果是走协定默认端口,缺省端口 80)
  • path 拜访资源的门路
  • query-string 参数,发送给 http 服务器的数据
  • anchor- 锚(跳转到网页的指定锚点地位)

例子:

  • http://www.sina.com.cn/
  • http://192.168.0.116:8080/index.jsp
  • http://item.jd.com/11052214.html#product-detail
  • http://www.website.com/test/test.aspx?name=sv&x=true#stuff 一个 URL 的申请过程:

当你在浏览器输出 URL http://www.website.com 的时候,浏览器发送一个 Request 去获取 http://www. website.com 的 html. 服务器把 Response 发送回给浏览器. 浏览器剖析 Response 中的 HTML,发现其中援用了很多其余文件,比方图片,CSS 文件,JS 文件。浏览器会主动再次发送 Request 去获取图片,CSS 文件,或者 JS 文件。当所有的文件都下载胜利后,网页就被显示进去了。

罕用的申请报头

  • Host

Host 初始 URL 中的主机和端口, 用于指定被申请资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取进去的

  • Connection

示意客户端与服务连贯类型;

  • client 发动一个蕴含 Connection:keep-alive 的申请
  • server 收到申请后,如果 server 反对 keepalive,回复一个蕴含 Connection:keep-alive 的响应,不敞开连贯,否则回复一个蕴含 Connection:close 的响应,敞开连贯。
  • 如果 client 收到蕴含 Connection:keep-alive 的响应,向同一个连贯发送下一个申请,直到一方被动敞开连贯。Keep-alive 在很多状况下可能重用连贯,缩小资源耗费,缩短响应工夫 HTTP
  • Accept

示意浏览器反对的 MIME 类型

MIME 的英文全称是 Multipurpose Internet Mail Extensions(多用途互联网邮件扩大)

eg:Accept:image/gif,表明客户端心愿承受 GIF 图象格局的资源;Accept:text/html,表明客户端心愿承受 html 文本。Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 意思:浏览器反对的 MIME 类型别离是 text/html、application/xhtml+xml、application/xml 和 */*,优先程序是它们从左到右的排列程序。Text:用于标准化地示意的文本信息,文本音讯能够是多种字符集和或者多种格局的;Application:用于传输应用程序数据或者二进制数据;

设定某种扩展名的文件用一种应用程序来关上的形式类型,当该扩展名文件被拜访的时候,浏览器会主动应用指定应用程序来关上

Mime 类型 扩展名
text/html .htm .html .shtml
text/plain text/html 是以 html 的模式输入,比方 <input type="text"/> 就会在页面上显示一个文本框,而以 plain 模式就会在页面上原样显示这段代码
application/xhtml+xml .xhtml .xml
text/css .css
application/msexcel .xls .xla
application/msword .doc .dot
application/octet-stream .exe
application/pdf .pdf
….. …..

q 是权重系数,范畴 0 =< q <= 1,q 值越大,申请越偏向于取得其“;”之前的类型示意的内容,若没有指定 q 值越大,申请越偏向于取得其“,则默认为 1,若被赋值为 0,则用于揭示服务器哪些是浏览器不承受的内容类型。

  • Content-Type

POST 提交,application/x-www-form-urlencoded 提交的数据依照 key1=val1&key2=val2 的形式进行编码,key 和 val 都进行了 URL 转码。

  • User-Agent

浏览器类型

  • Referer

申请来自哪个页面,用户是从该 Referer URL 页面拜访以后申请的页面。

  • Accept-Encoding

浏览器反对的压缩编码类型,比方 gzip, 反对 gzip 的浏览器返回经 gzip 编码的 HTML 页面。

许多情景下这能够缩小 5 到 10 倍的下载工夫

eg:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0 // 按程序反对 gzip , identity 如果有多个 Encoding 同时匹配, 依照 q 值顺序排列

如果申请音讯中没有设置这个域服务器假设客户端对各种内容编码都能够承受。

  • Accept-Language

浏览器所心愿的语言品种,当服务器可能提供一种以上的语言版本时要用到。

  1. eg:
  2. Accept-Language:zh-cn

如果申请音讯中没有设置这个报头域,服务器假设客户端对各种语言都能够承受。

  • Accept-Charset

浏览器可承受的字符集, 用于指定客户端承受的字符集

eg:Accept-Charset:iso-8859-1,gb2312ISO8859-1,通常叫做 Latin-1。Latin- 1 包含了书写所有东方欧洲语言不可短少的附加字符;gb2312 是规范中文字符集;UTF-8 是 UNICODE 的一种变长字符编码,能够解决多种语言文本显示问题,从而实现利用国际化和本地化。如果在申请音讯中没有设置这个域,缺省是任何字符集都能够承受。

HTTP 响应

学习目标

把握罕用的响应状态码

  • 响应状态码

响应状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

状态码

Response 音讯中的第一行叫做状态行,由 HTTP 协定版本号,状态码,状态音讯 三局部组成。

状态码用来通知 HTTP 客户端,HTTP 服务器是否产生了预期的 Response.

HTTP/1.1 中定义了 5 类状态码,状态码由三位数字组成,第一个数字定义了响应的类别

1XX 提示信息 – 示意申请已被胜利接管,持续解决

2XX 胜利 – 示意申请已被胜利接管,了解,承受

3XX 重定向 – 要实现申请必须进行更进一步的解决

4XX 客户端谬误 – 申请有语法错误或申请无奈实现

5XX 服务器端谬误 – 服务器未能实现非法的申请

分类 分类形容
1 信息,服务器收到申请,须要请求者继续执行操作
2 胜利,操作被胜利接管并解决
3 重定向,须要进一步的操作以实现申请
4 客户端谬误,申请蕴含语法错误或无奈实现申请
5** 服务器谬误,服务器在解决申请的过程中产生了谬误
  • 最罕用的响应状态码

◆200 (OK): 找到了该资源,并且一切正常。

◆301(Moved Permanently): 客户申请的文档在其余中央,新的 URL 在 Location 头中给出,浏览器应该主动地拜访新的 URL。

◆302 (Found): 相似于 301,但新的 URL 应该被视为临时性的代替,而不是永久性的。

◆304 (NOT MODIFIED): 该资源在上次申请之后没有任何批改。这通常用于浏览器的缓存机制。

◆400 (Bad Request): 申请呈现语法错误。

◆403 (FORBIDDEN): 客户端未能取得受权。这通常是在 401 之后输出了不正确的用户名或明码。

◆404 (NOT FOUND): 在指定的地位不存在所申请的资源。

◆500 (Internal Server Error): 服务器遇到了意料不到的状况,不能实现客户的申请

◆503 (Service Unavailable): 服务器因为保护或者负载过重未能应答。例如,Servlet 可能在数据库连接池已满的状况下返回 503。服务器返回 503 时能够提供一个 Retry-After 头


看看一些常见的状态码

200 OK

最常见的就是胜利响应状态码 200 了,这表明该申请被胜利地实现,所申请的资源发送回客户端

如下图,关上博客园首页

302 Found

重定向,新的 URL 会在 response 中的 Location 中返回,浏览器将会主动应用新的 URL 收回新的 Request

例如在 IE 中输出,http://www.google.com. HTTP 服务器会返回 302,IE 取到 Response 中 Location header 的新 URL, 又从新发送了一个 Request.

304 Not Modified

代表上次的文档曾经被缓存了,还能够持续应用,

例如关上博客园首页, 发现很多 Response 的 status code 都是 304

提醒:如果你不想应用本地缓存能够用 Ctrl+F5 强制刷新页面

400 Bad Request 客户端申请与语法错误,不能被服务器所了解

403 Forbidden 服务器收到申请,然而回绝提供服务

404 Not Found

申请资源不存在(输错了 URL)

比方在 IE 中输出一个谬误的 URL,http://www.cnblogs.com/tesdf.aspx

500 Internal Server Error 服务器产生了不可预期的谬误

503 Server Unavailable 服务器以后不能解决客户端的申请,一段时间后可能恢复正常


HTTP Request header

应用 Fiddler 能很不便的查看 Reques header, 点击 Inspectors tab ->Request tab-> headers 如下图所示

header 有很多,比拟难以记忆,咱们也依照 Fiddler 那样把 header 进行分类,这样比拟清晰也容易记忆。


Cache 头域

  • If-Modified-Since

作用:把浏览器端缓存页面的最初批改工夫发送到服务器去,服务器会把这个工夫与服务器上理论文件的最初批改工夫进行比照。如果工夫统一,那么返回 304,客户端就间接应用本地缓存文件。如果工夫不统一,就会返回 200 和新的文件内容。客户端接到之后,会抛弃旧文件,把新文件缓存起来,并显示在浏览器中.

例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

实例如下图

  • If-None-Match

作用: If-None-Match 和 ETag 一起工作,工作原理是在 HTTP Response 中增加 ETag 信息。当用户再次申请该资源时,将在 HTTP Request 中退出 If-None-Match 信息(ETag 的值)。如果服务器验证资源的 ETag 没有扭转(该资源没有更新),将返回一个 304 状态通知客户端应用本地缓存文件。否则将返回 200 状态和新的资源和 Etag. 应用这样的机制将进步网站的性能

例如: If-None-Match: “03f2b33c0bfcc1:0”

实例如下图

  • Pragma

作用:避免页面被缓存,在 HTTP/1.1 版本中,它和 Cache-Control:no-cache 作用截然不同

Pargma 只有一个用法,例如:Pragma: no-cache

留神: 在 HTTP/1.0 版本中,只实现了 Pragema:no-cache, 没有实现 Cache-Control

  • Cache-Control

作用: 这个是十分重要的规定。这个用来指定 Response-Request 遵循的缓存机制。各个指令含意如下

Cache-Control:Public 能够被任何缓存所缓存()

Cache-Control:Private 内容只缓存到公有缓存中

Cache-Control:no-cache 所有内容都不会被缓存

还有其余的一些用法,我没搞懂其中的意思,请大家参考其余的材料

Client 头域

  • Accept

作用:浏览器端能够承受的媒体类型,

例如:Accept: text/html 代表浏览器能够承受服务器回发的类型为 text/html 也就是咱们常说的 html 文档,

如果服务器无奈返回 text/html 类型的数据, 服务器应该返回一个 406 谬误(non acceptable)

通配符 代表任意类型

例如 Accept: /* 代表浏览器能够解决所有类型,(个别浏览器发给服务器都是发这个)

  • Accept-Encoding:

作用:浏览器申明本人接管的编码方法,通常指定压缩办法,是否反对压缩,反对什么压缩办法(gzip,deflate),(留神:这不是只字符编码);

例如:Accept-Encoding: gzip, deflate

  • Accept-Language

作用:浏览器申明本人接管的语言。

语言跟字符集的区别:中文是语言,中文有多种字符集,比方 big5,gb2312,gbk 等等;

例如:Accept-Language: en-us

  • User-Agent

作用:通知 HTTP 服务器,客户端应用的操作系统和浏览器的名称和版本.

咱们上网登陆论坛的时候,往往会看到一些欢送信息,其中列出了你的操作系统的名称和版本,你所应用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从 User-Agent 这个申请报头域中获取到这些信息 User-Agent 申请报头域容许客户端将它的操作系统、浏览器和其它属性通知服务器。

例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

  • Accept-Charset

作用:浏览器申明本人接管的字符集,这就是本文后面介绍的各种字符集和字符编码,如 gb2312,utf-8(通常咱们说 Charset 包含了相应的字符编码方案)


Cookie/Login 头域

Cookie:

作用:最重要的 header, 将 cookie 的值发送给 HTTP 服务器


Entity 头域

  • Content-Length

作用:发送给 HTTP 服务器数据的长度。

例如:Content-Length: 38

  • Content-Type

作用:

例如:Content-Type: application/x-www-form-urlencoded


Miscellaneous 头域

  • Referer:

作用:提供了 Request 的上下文信息的服务器,通知服务器我是从哪个链接过去的,比方从我主页上链接到一个敌人那里,他的服务器就可能从 HTTP Referer 中统计出每天有多少用户点击我主页上的链接拜访他的网站。

例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT


Transport 头域

  • Connection

例如:Connection: keep-alive 当一个网页关上实现后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连贯不会敞开,如果客户端再次拜访这个服务器上的网页,会持续应用这一条曾经建设的连贯

例如:Connection: close 代表一个 Request 实现后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连贯会敞开,当客户端再次发送 Request,须要从新建设 TCP 连贯。

  • Host(发送申请时,该报头域是必须的)

作用: 申请报头域次要用于指定被申请资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取进去的

例如: 咱们在浏览器中输出:http://www.guet.edu.cn/index.html

浏览器发送的申请音讯中,就会蕴含 Host 申请报头域,如下:Host:http://www.guet.edu.cn 此处应用缺省端口号 80,若指定了端口号,则变成:Host:指定端口号


HTTP Response header

同样应用 Fiddler 查看 Response header, 点击 Inspectors tab ->Response tab-> headers 如下图所示

咱们也依照 Fiddler 那样把 header 进行分类,这样比拟清晰也容易记忆。

Cache 头域

  • Date

作用: 生成音讯的具体工夫和日期

例如:Date: Sat, 11 Feb 2012 11:35:14 GMT

  • Expires

作用: 浏览器会在指定过期工夫内应用本地缓存

例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT

  • Vary

作用:要理解 Vary 的作用,先得理解 HTTP 的内容协商机制。有时候,同一个 URL 能够提供多份不同的文档,这就要求服务端和客户端之间有一个抉择最合适版本的机制,这就是内容协商。

例如: Vary: Accept-Encoding

Cookie/Login 头域

  • P3P

作用: 用于跨域设置 Cookie, 这样能够解决 iframe 跨域拜访 cookie 的问题

例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

  • Set-Cookie

作用:十分重要的 header, 用于把 cookie 发送到客户端浏览器,每一个写入 cookie 都会生成一个 Set-Cookie.

例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

Entity 头域

  • ETag

作用: 和 If-None-Match 配合应用。(实例请看上节中 If-None-Match 的实例)

例如: ETag: “03f2b33c0bfcc1:0”

  • Last-Modified:

作用:用于批示资源的最初批改日期和工夫。(实例请看上节的 If-Modified-Since 的实例)

例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

  • Content-Type

作用:WEB 服务器通知浏览器本人响应的对象的类型和字符集,

例如:

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

Content-Type:text/html;charset=GB2312

Content-Type: image/jpeg

  • Content-Length

指明实体注释的长度,以字节形式存储的十进制数字来示意。在数据上行的过程中,Content-Length 的形式要事后在服务器中缓存所有数据,而后所有数据再一股脑儿地发给客户端。

例如: Content-Length: 19847

  • Content-Encoding

WEB 服务器表明本人应用了什么压缩办法(gzip,deflate)压缩响应中的对象。

例如:Content-Encoding:gzip

  • Content-Language

作用:WEB 服务器通知浏览器本人响应的对象的语言者

例如:Content-Language:da

Miscellaneous 头域

  • Server:

作用:指明 HTTP 服务器的软件信息

例如:Server: Microsoft-IIS/7.5

  • X-AspNet-Version:

作用:如果网站是用 ASP.NET 开发的,这个 header 用来示意 ASP.NET 的版本

例如: X-AspNet-Version: 4.0.30319

  • X-Powered-By:

作用:示意网站是用什么技术开发的

例如:X-Powered-By: ASP.NET

Transport 头域

  • Connection

例如:Connection: keep-alive 当一个网页关上实现后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连贯不会敞开,如果客户端再次拜访这个服务器上的网页,会持续应用这一条曾经建设的连贯

例如:Connection: close 代表一个 Request 实现后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连贯会敞开,当客户端再次发送 Request,须要从新建设 TCP 连贯。

Location 头域

  • Location

作用:用于重定向一个新的地位, 蕴含新的 URL 地址

实例请看 304 状态实例


HTTP 协定是无状态的和 Connection: keep-alive 的区别

无状态是指协定对于事务处理没有记忆能力,服务器不晓得客户端是什么状态。从另一方面讲,关上一个服务器上的网页和你之前关上这个服务器上的网页之间没有任何分割

HTTP 是一个无状态的面向连贯的协定,无状态不代表 HTTP 不能放弃 TCP 连贯,更不能代表 HTTP 应用的是 UDP 协定(无连贯)

从 HTTP/1.1 起,默认都开启了 Keep-Alive,放弃连贯个性,简略地说,当一个网页关上实现后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连贯不会敞开,如果客户端再次拜访这个服务器上的网页,会持续应用这一条曾经建设的连贯

Keep-Alive 不会永恒放弃连贯,它有一个放弃工夫,能够在不同的服务器软件(如 Apache)中设定这个工夫

IT 入门 感激关注 |  练习地址:www.520mg.com/it

正文完
 0