2014-03-28 54 views
0

我正在向基於https的API發送請求。 在Chrome中輸入請求網址時,一切正常。當進行使用net/http包在走同樣的要求,我得到有關失蹤的子域的錯誤:獲取正在發送的HTTP請求正文

"error": { 
    "type": "ApiUnknown", 
    "message": "No api specified (via subdomain)" 
} 

我認爲Chrome和圍棋不知何故將略有不同的HTTP請求,所以,我需要知道這些差異可能是。

在Chrome中,我可以使用開發人員工具查看發送的請求。

如何從http包中獲取正在發送的HTTP請求正文?

我可以做到以下幾點:

package main 

import (
    "net/http" 
    "os" 
) 

func main() { 
    urlStr := "https://api-name.subdomain.domain.org/page?param=value" 

    //client := &http.Client{} 
    req, err := http.NewRequest("GET", urlStr, nil) 
    if err != nil { 
     panic(err) 
    } 
    req.Write(os.Stdout) // Will this output be equal to the one being sent to the server? 
    //resp, err := client.Do(req) 
} 

輸出:

GET /頁PARAM =值HTTP/1.1
主持人:API-name.subdomain.domain。 org
User-Agent:Go 1.1包http

遊樂場:http://play.golang.org/p/Oku0O1yiBt

但我不知道在發送之前的請求,或者這其實是所有有交通是否增加了一些。

+0

發送請求時可以設置額外的標頭(例如,如果在URL中有基本授權證書,在重定向等情況下有Referer,則爲授權)。你還沒有真正提供很多關於你的服務器爲什麼拒絕你的請求的信息。 –

+0

@JamesHenstridge:是的,我認爲可能是這樣。不,我沒有提供很多信息,因爲我真的不知道。這就是爲什麼我想看到實際的請求主體。我使用完全相同的'urlStr'並將其粘貼到同一臺計算機上的Chrome中,並得到不同的響應。我添加了Go http請求給我的實際響應。 – ANisus

+0

我可能會補充一點,雖然urlStr不是實際的url(好吧,呵呵),但它具有相同的結構。它甚至在'api-name'中有一個破折號,所以有一段時間我以爲Go可能會用URL編碼破折號,但事實並非如此。 – ANisus

回答

0

我只是看着net/http std lib源碼。正如James Henstridge已經回答的那樣:可能會增加一些額外的授權和傳輸相關標題。但是這都是嚴格遵守協議的。所以我不會認爲那裏有什麼問題。

您示例底部的代碼應該確實打印出所有相關信息。現在它取決於您的具體用例爲什麼您的請求失敗。

您是否指定了正確的子域(如錯誤消息所述)?

您是否有Content-Type標題集?根據您選擇的子域,服務器可能會檢查合適的Content-Type

這些只是我現階段可以做出的一些假設。