2017-08-15 171 views
1

我送使用python插座HTTPPOST要求:HTTP請求的內容爲空

import socket 

s = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM) 

s.connect(("127.0.0.1", 4001)) 

s.send(b'POST /session HTTP/1.1\r\nContent-Type:application/json\r\nUser-Agent: test/1\r\n\r\n{"desiredCapabilities": {}, "capabilities":{}}') 
response = s.recv(10000) 
print(response) 

輸出:

b'HTTP/1.1 200 OK\r\ncontent-length: 270\r\nContent-Type: application/json; charset=utf-8\r\nConnection: close\r\n\r\n{"sessionId":"72418bd14689c1cd9ee48706eada96a4","status":33,"value":{"message":"session not created exception: Missing or invalid capabilities\\n (Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Linux 4.4.0-91-generic x86_64)"}}' 

輸出的摘要 - 返回錯誤消息說,json對象我想發送丟失或不正確。

這就是爲什麼我決定用 mitmproxy來捕獲請求。

enter image description here

它沒有內容,同時應具備以下json內容:

{"desiredCapabilities": {}, "capabilities":{}} 

我不明白是什麼問題。我遵循HTTP規範 - 在我放入CRLF\r\n)的每個標頭之後和最後一個標頭(User-Agent)之後,我增加了CRLF,因爲在正文內容之前必須有一個空行。

Wiki HTTP message body

請求/狀態行和首部都必須一端與<CR><LF>(即, 回車後跟一個換行)。空行必須包含 只有<CR><LF>並且沒有其他空格。

+0

'print(response)'輸出是什麼? –

+0

Hi @Robᵩ我用回覆更新了問題。總之,響應是說'json'對象丟失了。 – CuriousGuy

+0

如果你使用mitmproxy,你需要在這裏開始回答問題,而不只是問;) –

回答

1

您發送的POST請求缺少Content-length標頭,即您發送的請求無效。由於缺少Content-length標題,服務器可能無法知道身體結束位置,並可能認爲根本沒有身體,即遠離預期身體。這也反映在您的評論中:「總之,回覆說的是json對象丟失」

我建議使用現有的HTTP庫,而不是直接嘗試使用套接字。 HTTP比大多數開發人員想象的要複雜。

+0

男人,非常感謝你!整天我都在想知道發生了什麼......它在添加'Content-Length'之後起作用了! – CuriousGuy

+0

*我想知道發生了什麼*整個一天* - 使用經過良好測試的HTTP庫可以爲您節省大量那麼可能會在將來節省更多時間請注意,根據您發送的請求,除了簡單響應外,您還需要能夠處理HTTP保持活動狀態和分塊響應,因爲這些功能通過使用HTTP隱式啓用版本1.1。再次,HTTP可能看起來很簡單,但它不是。 –

+0

是的,我已經使用一個庫,但我想嘗試在較低的水平:) – CuriousGuy