<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            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 會自動導入),但是你可以為 HTTPConnection 類 (urllib 在內部使用它來訪問 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 時將它送還給服務器之外,你也不需要用它做什么。然后服務器使用它告訴你修改日期是否被改變了。
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线