2013-07-26 183 views
6

如何讀取原始http文章STRING。我已經發現了幾種閱讀帖子解析版本的解決方案,但是我正在處理的項目提交了一個沒有標題的原始xml負載。所以我試圖找到一種方法來讀取發佈數據,而不會將其解析爲key => value數組。Python:BaseHTTPRequestHandler - 讀取原始文章

回答

11

我認爲self.rfile.read(self.headers.getheader('content-length'))應該將原始數據作爲字符串返回。 根據該文檔直接BaseHTTPRequestHandler類中:

- rfile is a file object open for reading positioned at the 
start of the optional input data part; 
+2

嘗試並做了一些快速的搜索後,此操作會阻止我執行以及其他操作。 – kwolfe

+1

需要提供內容長度:data = self.rfile.read(int(self.headers.getheader('content-length'))) – kwolfe

+5

是的,對不起。它是阻塞的,因爲rfile對象是一個套接字,並且調用'read()'基本上是說'讀直到沒有什麼可以讀取',但只要套接字是打開的,它就會讀更多,所以它掛起並等待傳入​​的內容。通過總是指定多少內容來讀取服務器,服務器避免了掛起。對不起,我應該把它放在首位。 – smakateer

13

self.rfile.read(int(self.headers.getheader('Content-Length')))將返回原始HTTP POST數據爲字符串。

其分解:

  1. 標題 '的Content-Length' 指定多少個字節的HTTP POST數據包含。
  2. self.headers.getheader('Content-Length')以字符串的形式返回內容長度(標題的值)。
  3. 必須先將其轉換爲一個整數,然後才能將其作爲參數傳遞給self.rfile.read(),因此請使用int()函數。

另外請注意,在標題名稱是大小寫敏感的,以便它具有被指定爲唯一的「內容長度」。

編輯:顯然頭域不區分大小寫(至少在Python 2.7.5),我相信這是因爲https://tools.ietf.org/html/rfc2616狀態正確的行爲:

每個頭域由一個名字後面的 一個冒號(「:」)和字段值。字段名稱 不區分大小寫。

+0

請更詳細一點,我不知道你在暗示什麼。 –

+1

@jb:我在答案中增加了更多細節。讓我知道是否有任何具體的東西需要進一步闡述。 –

+0

@SindhuriKuppasad,標題名稱不區分大小寫。下面的語句都返回我測試中的內容長度: 'self.headers.getheader('content-length')''和'self.headers.getheader('content-LENGTH')' – famzah