2014-01-31 32 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