11.4. 调试 HTTP web 服务

优质
小牛编辑
129浏览
2023-12-01

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
1urllib 依赖于另一个 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 时将他送还给服务器之外, 你也不需要用它做什么。 然后服务器使用它告诉你修改日期是否被改变了。