11.4. 调试 HTTP web 服务

首先, 让我们开启 Python HTTP 库的调试特性并查看网络线路上的传输过程。 这对本章的全部内容都很有用, 因为你将添加越来越多的特性。

例 11.3. 调试 HTTP

>>> import httplib
>>> httplib.HTTPConnection.debuglevel = 1             1
>>> import urllib
>>> feeddata = urllib.urlopen('http://diveintomark.org/xml/atom.xml').read()
connect: (diveintomark.org, 80)                       2
send: '
GET /xml/atom.xml HTTP/1.0                            3
Host: diveintomark.org                                4
User-agent: Python-urllib/1.15                        5
'
reply: 'HTTP/1.1 200 OK\r\n'                          6
header: Date: Wed, 14 Apr 2004 22:27:30 GMT
header: Server: Apache/2.0.49 (Debian GNU/Linux)
header: Content-Type: application/atom+xml
header: Last-Modified: Wed, 14 Apr 2004 22:14:38 GMT  7
header: ETag: "e8284-68e0-4de30f80"                   8
header: Accept-Ranges: bytes
header: Content-Length: 26848
header: Connection: close
1 urllib 依赖于另一个 Python 的标准库, httplib。 通常你不必显示地给出 import httplib (urllib 会自动导入), 但是你可以为 urllib 使用内部的 HTTPConnection 类设置调试标记来访问 HTTP 服务器。 这是一种令人难以置信的有用技术。 Python 其他的一些库也有类似的调试标记, 但是没有命名和开启他们的特殊标准; 如果有类似的特性可用,你需要阅读每一个库的文档来查看使用方法。
2 既然已经设置了调试标记, HTTP 的请求和响应信息会实时地被打印出来。 首先告诉你的是你连接服务器 diveintomark.org 的 80 端口, 这是 HTTP 的标准端口。
3 当你请求 Atom feed 时, urllib 向服务器发送三行信息。 第一行指出你使用的 HTTP verb, 和资源的路径 (除去域名)。 在本章中所有的请求都将使用 GET, 但是在下一章的 SOAP 中, 你会看到所有的请求都使用 POST 。除了请求的动词不同之外, 基本的语法是相同的。
4 第二行是 Host 头信息, 它指出你所访问的服务的域名。 这一点很重要, 因为一个独立的 HTTP 服务器可以服务于多个不同的域。 当前我的服务器服务于 12 个域; 其他的服务器可以服务于成百乃至上千个域。
5 第三行是 User-Agent 头信息。 在此你看到的是由 urllib 库默认添加的普通的 User-Agent 。 在下一节, 你会看到如何自定义它的更多细节。
6 服务器用状态代码和一系列的头信息答复 (并且一些数据可能会被存储到 feeddata 变量中)。 这里的状态代码是 200, 意谓着 “一切正常, 这就是您请求的数据”。 服务器也会告诉你响应请求的数据, 一些有关服务器自身的信息, 传给你的数据的内容类型。 根据你的应用不同, 这或许有用, 或许没用。 这充分确认了你所请求的是一个 Atom feed, 瞧, 你获得了 Atom feed (application/atom+xml, 它是已经注册的有关 Atom feeds 的内容类型)。
7 当此 Atom feed 有最近的修改, 服务器会告诉你 (本例中, 大约发生在 13 分钟之前)。 当下次请求同样的 feed 时,你可以这个日期再发送给服务器, 服务器将做最近修改数据检查。
8 服务器也会告诉你这个 Atom feed 有一个值为 "e8284-68e0-4de30f80" 的 ETag hash。 这个 hash 自身没有任何意义; 除了在下次访问相同的 feed 时将他送还给服务器之外, 你也不需要用它做什么。 然后服务器使用它告诉你修改日期是否被改变了。