Differences between revisions 1 and 7 (spanning 6 versions)
Revision 1 as of 2007-08-01 05:43:10
Size: 287
Editor: XiaoQi
Comment:
Revision 7 as of 2007-08-04 07:11:40
Size: 10280
Editor: XiaoQi
Comment:
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:
 1. 频繁typo:  * 频繁typo:
Line 5: Line 5:
 1. '''类似文件的对象'''一律改为'''类文件对象'''。  * '''类似文件的对象'''一律改为'''类文件对象'''。
 * ''client'' 一律译为'''客户端'''。
 * ''file-like object'' 一律译为'''类文件对象'''。

== 概览 ==
 1. `Para 2`:''Simply stated, HTTP web services are '''programmatic''' ways of sending and receiving data from remote servers using the operations of HTTP directly.''[[BR]]
 简单地讲,HTTP web 服务是指直接使用 HTTP 操作从远程服务器'''按部就班地'''发送和接收数据。[[BR]]
 (./) 简单地讲,HTTP web 服务是指'''以编程的方式'''直接使用 HTTP 操作从远程服务器发送和接收数据。
 1. `Para 3`:''The main advantage of this approach is simplicity,...''[[BR]]
 '''利用'''这种方法的'''要点'''是'''简单的''',……[[BR]]
 (./) 这种方法的'''主要优点是简单''',……
 1. `例11.1上, Para -2`:在后面的几章里,我们将探索使用 HTTP '''做''' <!> 数据发送和接收传输的 API…… (./) '''进行'''

== 避免通过 HTTP 重复地获取数据 ==
 `pass`

== HTTP 特性 ==
 1. `重定向, Para 3`:……然后在 Location: '''头部'''给出新地址[[BR]]
 (./) 然后在 Location: '''头信息中'''给出新地址
 1. `Last-Modified/If-Modified-Since, Para 1`:[[BR]]
 通常服务器'''指导''' <!> 你所请求的数据的最后修改时间 (./) '''知道'''
 1. `Last-Modified/If-Modified-Since, Para 2`:[[BR]]
 ……你可以告诉服务器你上一次获得的最后修改日期:在你的请求中发送'''了''' {X} 一个 If-Modified-Since 头信息……'''为什么''' {X} 这一点有何进步呢?'''因为''' {X} 当服务器发送状态编码 304 时,不再重新发送数据……
 1. `Last-Modified/If-Modified-Since, Para 4`:[[BR]]
 所有现代的浏览器都支持最近修改 {i} ^(last-modified)^的数据检查。……服务器简单地返回 304: {i} ^Not Modified(^ 没有修改^)^
 1. `ETag/If-None-Match, Para 1`:[[BR]]
 ETag 是实现与最近修改数据检查同样的功能的另一种方法:没有变化时不重新下载数据。其工作'''原理''' ^方式^是:服务器发送你所请求的数据的同时,发送某种数据的 hash (在 ETag 头信息中 {i} ^给出^),hash 的确定完全取决于服务器。当第二次请求相同的数据时, {i} ^你需要^在 If-None-Match: 头信息中包含 ETag hash,……在第二次请求时,通过包含 ETag hash,你'''会''' {X} 告诉服务器……
 1. `压缩, Para 1`:''When you talk about HTTP web services, you're almost always talking about moving XML back and forth over the wire. XML is text, and quite verbose text at that, and text generally compresses well.''[[BR]]
 '''当谈论 HTTP web 服务时,几乎总是会谈及'''在网络线路上传输的 XML。XML 是文本,而且还是相当冗长的文本,'''并且'''文本通常可以被很好地压缩。[[BR]]
 (./) '''关于 HTTP web 服务的主题几乎总是会涉及'''在网络线路上传输的 XML。XML 是文本,而且还是相当冗长的文本,'''而'''文本通常可以被很好地压缩。

== 调试 HTTP web 服务 ==
 1. `例11.3, (1)`:''...you can set the debugging flag on the HTTPConnection class that urllib uses internally to connect to the HTTP server.''
 你可以为 '''urllib 使用内部的 HTTPConnection 类设置调试标记来访问 HTTP 服务器'''。[[BR]]
 (./) 你可以为 '''HTTPConnection 类(urllib 在内部使用它来访问 HTTP 服务器)设置调试标记'''。
 1. `例11.3, (6)`:服务器也会告诉你响应请求的数据、一些有关服务器自身的信息, {i} ^以及^传给你的数据的内容类型。

== 设置 User-Agent ==
 1. `例11.4, (1)`:如果你的 Python IDE 仍旧为上一节的例子而打开着,你可以略过这一步,在开启 HTTP 调试'''中''' <!> 你能看到网络线路上的实际传输过程。 (./) '''时'''
 1. `例11.4, (3)`:第二步是创建一个 URL 开启器 (opener)。'''这'''可以'''使用'''任何数量的'''操作者'''来控制响应的处理。但你也可以创建一个没有任何自定义'''处理'''的开启器,'''这就是这里的操作方式'''。[[BR]]
 (./) 第二步是创建一个 URL 开启器 (opener)。'''它'''可以'''接受'''任何数量的'''处理器'''来控制响应的处理。但你也可以创建一个没有任何自定义'''处理器'''的开启器,'''在这儿你就是这么做的'''。
 1. `例11.5`:'''用''' Request 添加头信息 (./) '''给''' Request 添加头信息
 1. `例11.5, (2)`:''Convention dictates that a User-Agent should be in this specific format: an application name, followed by a slash, followed by a version number.''[[BR]]
 User-Agent '''的协商指令应该使用如下的特殊格式''':应用名,跟一个斜线,跟版本号。[[BR]]
 (./) User-Agent '''的约定格式是''':应用名,跟一个斜线,跟版本号。
 1. `同上`:'''User-Agent 通常要记录经过服务器的连同你的请求的其他详细信息,包含你的应用的 URL,'''如果发生错误,'''允许'''服务器管理员通过查看他们的访问日志与你联系。[[BR]]
 (./) '''和你的请求的其他信息一样,User-Agent 会被服务器纪录下来,其中包含你的应用的 URL。'''如果发生错误,服务器管理员'''就能'''通过查看他们的访问日志与你联系。
 1. `例11.5, (3)`:之前你创建的 opener 对象也可以再生,且它将再次获得相同的 feed,'''但是使用了你自定义的 User-Agent 头信息。'''[[BR]]
 (./) '''但这次'''使用了你自定义的 User-Agent; 头信息。
 1. `例11.5, (4)`:若你继续看,会注意到你定义的 User-Agent 头信息,'''你实际上发送了一个''' User-agent 头信息。看看有何不同?urllib2 改变了大小写所以只有首字母是大写的。这没问题,因为 HTTP 规定'''头子段名完全是'''大小写无关的。[[BR]]
 (./) 若你继续看,会注意到你定义的'''是''' User-Agent 头信息,'''但实际上发送的是''' User-agent 头信息。看看有何不同?urllib2 改变了大小写所以只有首字母是大写的。这没问题,因为 HTTP 规定'''头信息的字段名是'''大小写无关的。

== 处理 Last-Modified 和 ETag ==
 1. 作名词短语的'''调用程序'''一律改为'''主调程序'''。
 1. `Para 1`:接下来看看 {i} ^如何^添加 Last-Modified 和 ETag 头信息的支持。
 1. `例11.6, (1)`:这里便是'''你如何以编程方式访问它们'''[[BR]]
 (./) 这里便是'''用编程方式访问它们的方法'''
 1. `例11.6, (3)`:''You can see from the traceback that urllib2 throws a special exception, HTTPError, '''in response to''' the 304 status code.''[[BR]]
 毫无疑问,数据没被改变。你可以从跟踪返回结果看到 urllib2 '''扔掉了'''特殊异常,HTTPError,'''响应中的''' 304 状态代码。[[BR]]
 (./) 毫无疑问,数据没被改变。你可以从跟踪返回结果看到 urllib2 '''抛出了'''一个特殊异常,HTTPError,'''以响应''' 304 状态代码。
 1. `例11.7上`:urllib2 也为你认为是错误的其他条件引发 HTTPError 异常,……'''当你企图'''捕获状态代码并简单返回它,'''不抛弃'''任何异常时,这应该对你很有帮助。[[BR]]
 (./) urllib2 也为你认为是错误的其他条件引发 HTTPError 异常,……捕获状态代码并简单返回它,'''而不是'''抛出异常,这应该对你很有帮助。
 1. `例11.7, (1)`: 当某事件发生——比如一个 HTTP 错误,'''以至'''一个 304 代码——urllib2 审视用于处理它的 一系列已定义的处理器方法。'''你使用了一个与 第 9 章 XML 处理 类似的自省为不同节点类型定义了一些处理器''',……[[BR]]
 (./) 当某事件发生时——比如一个 HTTP 错误,'''甚至'''是 304 代码——urllib2 审视用于处理它的 一系列已定义的处理器方法。'''在此要用到自省,与 第 9 章 XML 处理 中为不同节点类型定义不同处理器类似'''。
 1. `例11.7, (2)`:当从服务器'''遇到''' <!> 一个 304 状态代码,…… (./) '''接收到'''
 1. `例11.8, (2)`:还记得我怎么说 urllib2 将一个 HTTP 资源的访问过程分解为三个步骤的正当理由吗?'''这便是为什么构建 HTTP 开启器就是它自身的步骤''',……[[BR]]
 (./) '''这便是为什么构建 HTTP 开启器是其步骤之一'''
 1. `例11.8, (3)`:''Now you can quietly open the resource, and what you get back is an object that, along with the usual headers (use seconddatastream.headers.dict to acess them), also contains the HTTP status code. In this case, '''as you expected''', the status is 304, meaning this data hasn't changed since the last time you asked for it.''[[BR]]
 现在你可以快速地打开一个资源,'''返回给你的是,连同常规头信息在内的对象 (使用 seconddatastream.headers.dict 访问它们),也包括 HTTP 状态代码。在这种情况下,向你所期望的,'''状态代码是 304,意味着此数据自从上次请求后没有被修改。[[BR]]
 (./) 现在你可以快速地打开一个资源,'''返回给你的对象既包括常规头信息 (使用 seconddatastream.headers.dict 访问它们),也包括 HTTP 状态代码。在此,正如你所期望的,'''状态代码是 304,意味着此数据自从上次请求后没有被修改。
 1. `例11.8, (4)`:注意当服务器返回 304 状态代码时,并没有重新发送数据。这就是全部的关键:没有重新下载未修改的数据 {i} ^,从而^节省了带宽。
 1. `例11.8下`:处理 ETag 的工作也非常'''相像,不是'''检查 Last-Modified 并发送 If-Modified-Since,而是检查 ETag 并发送 If-None-Match。[[BR]]
 (./) 处理 ETag 的工作也非常'''相似,只不过不是'''检查……
 1. `例11.9`:'''Supporting''' ETag/If-None-Match (./) '''支持''' ETag/If-None-Match

8-1<X11>openanything.xml HTTP web 服务

  • 频繁typo:
    • 意谓 (./) 意味

    • hander 多处被误认为header,因此被翻译成了“头信息”,改为处理器

  • 类似文件的对象一律改为类文件对象

  • client 一律译为客户端

  • file-like object 一律译为类文件对象

概览

  1. Para 2Simply stated, HTTP web services are programmatic ways of sending and receiving data from remote servers using the operations of HTTP directly.BR 简单地讲,HTTP web 服务是指直接使用 HTTP 操作从远程服务器按部就班地发送和接收数据。BR (./) 简单地讲,HTTP web 服务是指以编程的方式直接使用 HTTP 操作从远程服务器发送和接收数据。

  2. Para 3The main advantage of this approach is simplicity,...BR 利用这种方法的要点简单的,……BR (./) 这种方法的主要优点是简单,……

  3. 例11.1上, Para -2:在后面的几章里,我们将探索使用 HTTP <!> 数据发送和接收传输的 API…… (./) 进行

避免通过 HTTP 重复地获取数据

  • pass

HTTP 特性

  1. 重定向, Para 3:……然后在 Location: 头部给出新地址BR (./) 然后在 Location: 头信息中给出新地址

  2. Last-Modified/If-Modified-Since, Para 1BR 通常服务器指导 <!> 你所请求的数据的最后修改时间 (./) 知道

  3. Last-Modified/If-Modified-Since, Para 2BR ……你可以告诉服务器你上一次获得的最后修改日期:在你的请求中发送 {X} 一个 If-Modified-Since 头信息……为什么 {X} 这一点有何进步呢?因为 {X} 当服务器发送状态编码 304 时,不再重新发送数据……

  4. Last-Modified/If-Modified-Since, Para 4BR 所有现代的浏览器都支持最近修改 {i} (last-modified)的数据检查。……服务器简单地返回 304: {i} Not Modified( 没有修改

  5. ETag/If-None-Match, Para 1BR ETag 是实现与最近修改数据检查同样的功能的另一种方法:没有变化时不重新下载数据。其工作原理 方式是:服务器发送你所请求的数据的同时,发送某种数据的 hash (在 ETag 头信息中 {i} 给出),hash 的确定完全取决于服务器。当第二次请求相同的数据时, {i} 你需要在 If-None-Match: 头信息中包含 ETag hash,……在第二次请求时,通过包含 ETag hash,你 {X} 告诉服务器……

  6. 压缩, Para 1When you talk about HTTP web services, you're almost always talking about moving XML back and forth over the wire. XML is text, and quite verbose text at that, and text generally compresses well.BR 当谈论 HTTP web 服务时,几乎总是会谈及在网络线路上传输的 XML。XML 是文本,而且还是相当冗长的文本,并且文本通常可以被很好地压缩。BR (./) 关于 HTTP web 服务的主题几乎总是会涉及在网络线路上传输的 XML。XML 是文本,而且还是相当冗长的文本,文本通常可以被很好地压缩。

调试 HTTP web 服务

  1. 例11.3, (1)...you can set the debugging flag on the HTTPConnection class that urllib uses internally to connect to the HTTP server. 你可以为 urllib 使用内部的 HTTPConnection 类设置调试标记来访问 HTTP 服务器BR (./) 你可以为 HTTPConnection 类(urllib 在内部使用它来访问 HTTP 服务器)设置调试标记

  2. 例11.3, (6):服务器也会告诉你响应请求的数据、一些有关服务器自身的信息, {i} 以及传给你的数据的内容类型。

设置 User-Agent

  1. 例11.4, (1):如果你的 Python IDE 仍旧为上一节的例子而打开着,你可以略过这一步,在开启 HTTP 调试 <!> 你能看到网络线路上的实际传输过程。 (./)

  2. 例11.4, (3):第二步是创建一个 URL 开启器 (opener)。可以使用任何数量的操作者来控制响应的处理。但你也可以创建一个没有任何自定义处理的开启器,这就是这里的操作方式BR (./) 第二步是创建一个 URL 开启器 (opener)。可以接受任何数量的处理器来控制响应的处理。但你也可以创建一个没有任何自定义处理器的开启器,在这儿你就是这么做的

  3. 例11.5 Request 添加头信息 (./) Request 添加头信息

  4. 例11.5, (2)Convention dictates that a User-Agent should be in this specific format: an application name, followed by a slash, followed by a version number.BR User-Agent 的协商指令应该使用如下的特殊格式:应用名,跟一个斜线,跟版本号。BR (./) User-Agent 的约定格式是:应用名,跟一个斜线,跟版本号。

  5. 同上User-Agent 通常要记录经过服务器的连同你的请求的其他详细信息,包含你的应用的 URL,如果发生错误,允许服务器管理员通过查看他们的访问日志与你联系。BR (./) 和你的请求的其他信息一样,User-Agent 会被服务器纪录下来,其中包含你的应用的 URL。如果发生错误,服务器管理员就能通过查看他们的访问日志与你联系。

  6. 例11.5, (3):之前你创建的 opener 对象也可以再生,且它将再次获得相同的 feed,但是使用了你自定义的 User-Agent 头信息。BR (./) 但这次使用了你自定义的 User-Agent; 头信息。

  7. 例11.5, (4):若你继续看,会注意到你定义的 User-Agent 头信息,你实际上发送了一个 User-agent 头信息。看看有何不同?urllib2 改变了大小写所以只有首字母是大写的。这没问题,因为 HTTP 规定头子段名完全是大小写无关的。BR (./) 若你继续看,会注意到你定义的 User-Agent 头信息,但实际上发送的是 User-agent 头信息。看看有何不同?urllib2 改变了大小写所以只有首字母是大写的。这没问题,因为 HTTP 规定头信息的字段名是大小写无关的。

处理 Last-Modified 和 ETag

  1. 作名词短语的调用程序一律改为主调程序

  2. Para 1:接下来看看 {i} 如何添加 Last-Modified 和 ETag 头信息的支持。

  3. 例11.6, (1):这里便是你如何以编程方式访问它们BR (./) 这里便是用编程方式访问它们的方法

  4. 例11.6, (3)You can see from the traceback that urllib2 throws a special exception, HTTPError, in response to the 304 status code.BR 毫无疑问,数据没被改变。你可以从跟踪返回结果看到 urllib2 扔掉了特殊异常,HTTPError,响应中的 304 状态代码。BR (./) 毫无疑问,数据没被改变。你可以从跟踪返回结果看到 urllib2 抛出了一个特殊异常,HTTPError,以响应 304 状态代码。

  5. 例11.7上:urllib2 也为你认为是错误的其他条件引发 HTTPError 异常,……当你企图捕获状态代码并简单返回它,不抛弃任何异常时,这应该对你很有帮助。BR (./) urllib2 也为你认为是错误的其他条件引发 HTTPError 异常,……捕获状态代码并简单返回它,而不是抛出异常,这应该对你很有帮助。

  6. 例11.7, (1): 当某事件发生——比如一个 HTTP 错误,以至一个 304 代码——urllib2 审视用于处理它的 一系列已定义的处理器方法。你使用了一个与 第 9 章 XML 处理 类似的自省为不同节点类型定义了一些处理器,……BR (./) 当某事件发生时——比如一个 HTTP 错误,甚至是 304 代码——urllib2 审视用于处理它的 一系列已定义的处理器方法。在此要用到自省,与 第 9 章 XML 处理 中为不同节点类型定义不同处理器类似

  7. 例11.7, (2):当从服务器遇到 <!> 一个 304 状态代码,…… (./) 接收到

  8. 例11.8, (2):还记得我怎么说 urllib2 将一个 HTTP 资源的访问过程分解为三个步骤的正当理由吗?这便是为什么构建 HTTP 开启器就是它自身的步骤,……BR (./) 这便是为什么构建 HTTP 开启器是其步骤之一

  9. 例11.8, (3)Now you can quietly open the resource, and what you get back is an object that, along with the usual headers (use seconddatastream.headers.dict to acess them), also contains the HTTP status code. In this case, as you expected, the status is 304, meaning this data hasn't changed since the last time you asked for it.BR 现在你可以快速地打开一个资源,返回给你的是,连同常规头信息在内的对象 (使用 seconddatastream.headers.dict 访问它们),也包括 HTTP 状态代码。在这种情况下,向你所期望的,状态代码是 304,意味着此数据自从上次请求后没有被修改。BR (./) 现在你可以快速地打开一个资源,返回给你的对象既包括常规头信息 (使用 seconddatastream.headers.dict 访问它们),也包括 HTTP 状态代码。在此,正如你所期望的,状态代码是 304,意味着此数据自从上次请求后没有被修改。

  10. 例11.8, (4):注意当服务器返回 304 状态代码时,并没有重新发送数据。这就是全部的关键:没有重新下载未修改的数据 {i} ,从而节省了带宽。

  11. 例11.8下:处理 ETag 的工作也非常相像,不是检查 Last-Modified 并发送 If-Modified-Since,而是检查 ETag 并发送 If-None-Match。BR (./) 处理 ETag 的工作也非常相似,只不过不是检查……

  12. 例11.9Supporting ETag/If-None-Match (./) 支持 ETag/If-None-Match

DiveIntoPythonZh/2007-08-01 (last edited 2009-12-25 07:18:29 by localhost)