2014-01-31 80 views
0

我試圖通過Go發佈內容到nginx服務器。我覈實,我能夠正確發佈通過捲曲這樣的內容,特別是使用下面的命令:Getting Go的HTTP post來模擬curl -d

$ curl http://example.com/myendpoint -d "Some Text" 

我能看到這個帖子,並正確處理它。但是,當我嘗試使用Go執行POST時,它會被服務器拒絕。在nginx的訪問日誌,我看到這兩條線:

127.0.0.1 - - [30/Jan/2014:05:57:34 +0000] "POST /myendpoint HTTP/1.1" 400 0 "-" "Go 1.1 package http" 
127.0.0.1 - - [30/Jan/2014:05:57:39 +0000] "Some Text" 400 172 "-" "-" 

,我已經試過代碼如下:

r, err := http.Post(uri, "application/x-www-form-urlencoded", bytes.NewReader(data)) 
if err != nil { 
    log.Printf("HTTP NOTIFICATION ERROR: %s\n", err) 
    return 
} 
r.Body.Close() 

有什麼,我做錯了什麼?謝謝!

+0

我認爲這只是整體代碼的一部分,所以如果推遲r.Body.Close()'? – bishop

+0

@bishop:不幸的是,這並沒有幫助解決問題。我上面粘貼的代碼是在它自己的函數中,它實際上已經分離成一個單獨的goroutine。 –

回答

3

我無法看到您提供的代碼片段的任何特定問題,但您可能不會按照application/x-www-form-urlencoded's specification的要求編碼數據。

嘗試使用PostForm代替,這將代表您執行這一點:如果是更方便

import (
    "net/url" 
) 

// ... 

r, err := http.PostForm(uri, url.Values{"key": {"Value"}, "id": {"123"}}) 
+0

這個技巧。謝謝! –

-1

爲你您的文章數據轉換爲[]字節,VS url.Values,您可以使用HTTP 。客戶。下面的代碼顯示瞭如何使用客戶端來處理新的http請求。

var client http.Client 
req, err := http.NewRequest("POST", myURL, data) // data is of type []byte 

if err != nil {  
    // todo: do something 
} 
req.Header.Add("Content-Type", "application/x-www-form-urlencoded") 

resp, err := client.Do(req) 
if err != nil { 
       // todo: do something 
} 
defer resp.Body.Close() 

    // process your response. 
+0

我不明白倒票。請賜教,以免我犯同樣的錯誤。 – rexposadas

+1

可能是你的第一段的誤解(我也不明白你在說什麼),你的代碼在功能上與OP原始代碼完全一樣(查看Client.Post的源代碼)。 – JimB

+0

@JimB - 我衝了那個答案。感謝您澄清downvote。 – rexposadas