11.4. 调试 HTTP web 服务
Description: Python from novice to pro
Keywords: Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free

# 深入 Python :Dive Into Python 中文版 Python 从新手到专家 [Dip_5.4b_CPyUG_Release] | Find:

## 11.4. 调试 HTTP web 服务

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

### 例 11.3. 调试 HTTP

    >>> import httplib
    >>> httplib.HTTPConnection.debuglevel = 1
    >>> import urllib
    >>> feeddata = urllib.urlopen('http://diveintomark.org/xml/atom.xml').read()
    connect: (diveintomark.org, 80)
    send: '
    GET /xml/atom.xml HTTP/1.0
    Host: diveintomark.org
    User-agent: Python-urllib/1.15
    '
    reply: 'HTTP/1.1 200 OK\r\n'
    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
    header: ETag: "e8284-68e0-4de30f80"
    header: Accept-Ranges: bytes
    header: Content-Length: 26848
    header: Connection: close

| `urllib` 依赖于另一个 Python 的标准库，`httplib`。通常你不必显式地给出 `import httplib` (`urllib` 会自动导入)，但是你可以为 `HTTPConnection` 类 (`urllib` 在内部使用它来访问 HTTP 服务器) 设置调试标记。这是一种令人难以置信的有用技术。Python 其他的一些库也有类似的调试标记，但是没有命名和开启它们的特殊标准；如果有类似的特性可用，你需要阅读每一个库的文档来查看使用方法。
| 既然已经设置了调试标记，HTTP 的请求和响应信息会实时地被打印出来。首先告诉你的是你连接服务器 `diveintomark.org` 的 80 端口，这是 HTTP 的标准端口。
| 当你请求 Atom feed 时，`urllib` 向服务器发送三行信息。第一行指出你使用的 HTTP verb 和资源的路径 (除去域名)。在本章中所有的请求都将使用 `GET`，但是在下一章的 SOAP 中，你会看到所有的请求都使用 `POST` 。除了请求的动词不同之外，基本的语法是相同的。
| 第二行是 `Host` 头信息，它指出你所访问的服务的域名。这一点很重要，因为一个独立的 HTTP 服务器可以服务于多个不同的域。当前我的服务器服务于 12 个域；其他的服务器可以服务于成百乃至上千个域。
| 第三行是 `User-Agent` 头信息。在此你看到的是由 `urllib` 库默认添加的普通的 `User-Agent` 。在下一节，你会看到如何自定义它的更多细节。
| 服务器用状态代码和一系列的头信息答复 (其中一些数据可能会被存储到 `feeddata` 变量中)。这里的状态代码是 `200`，意味着 “一切正常，这就是您请求的数据”。服务器也会告诉你响应请求的数据、一些有关服务器自身的信息，以及传给你的数据的内容类型。根据你的应用不同，这或许有用，或许没用。这充分确认了你所请求的是一个 Atom feed，瞧，你获得了 Atom feed (`application/atom+xml`，它是已经注册的有关 Atom feeds 的内容类型)。
| 当此 Atom feed 有最近的修改，服务器会告诉你 (本例中，大约发生在 13 分钟之前)。当下次请求同样的 feed 时，你可以这个日期再发送给服务器，服务器将做最近修改数据检查。
| 服务器也会告诉你这个 Atom feed 有一个值为 `"e8284-68e0-4de30f80"` 的 ETag hash。这个 hash 自身没有任何意义；除了在下次访问相同的 feed 时将它送还给服务器之外，你也不需要用它做什么。然后服务器使用它告诉你修改日期是否被改变了。