2013-07-16 42 views
1

在Go http服務器中,我可以獲得POST請求體。去淨/ http包似乎刪除GET請求體。我知道最好不要使用http GET with request body,但我需要處理帶請求主體的http GET。有沒有可能不改變標準庫? 請幫忙,因爲我不想用libevent切換回C!如何解析http在Go http服務器中獲取請求正文?

當客戶端發送帶請求正文的POST時,以下代碼將顯示正文內容。但是當一個客戶端發送一個包含請求正文的GET時,正文中沒有任何內容。

​​
+0

你「**需要**來處理帶請求體的http GET」嗎?真的嗎?您的設計中可能存在問題。 –

+0

我無法更改協議。我希望我能。 – gosharplite

+0

你可以發表一個你想*實現的代碼的例子嗎?很難理解你在問什麼。 – elithrar

回答

3

大部分的魔法發生在transfer.go。下面是我發現看在fixLength FUNC相關:

if !isResponse && requestMethod == "GET" { 
    // RFC 2616 doesn't explicitly permit nor forbid an 
    // entity-body on a GET request so we permit one if 
    // declared, but we default to 0 here (not -1 below) 
    // if there's no mention of a body. 
    return 0, nil 
} 

樣子,只要你的客戶端結束了Content-Length頭,你都好。如果沒有,圖書館會認爲GET請求中沒有正文。

當你的客戶正在做一些非常不尋常的/破碎的東西時,你有點偏離地圖的邊緣。如果你能解決客戶問題,那就是你最好的選擇。這就是說,如果你有一個客戶,你需要支持這個做錯了,你將不得不自己推出一些東西。你不需要一直到C和libevent。只需將標準庫中的net/http軟件包複製到您的項目中並修改即可。然後更改您的導入語句以指向您的圖書館版本。或者,如果您知道客戶端未使用保持活動狀態,則可以連接該連接並只讀取套接字上剩下的任何內容。

+0

你是對的。當GET沒有指定Content-Length時,r.Body是一個eofReader(eofReader是一個非零的io.ReadCloser,它總是返回EOF)。 – gosharplite