Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang HTTP Post错误:连接被拒绝_Post_Go - Fatal编程技术网

Golang HTTP Post错误:连接被拒绝

Golang HTTP Post错误:连接被拒绝,post,go,Post,Go,我正在尝试向运行PHP应用程序的端口8080上的本地主机发送post请求 我的工作很好: curl --data "key=asdf" http://localhost:8080/ 但在Go中,我得到以下错误: Post http://localhost:8080: dial tcp 127.0.0.1:8080: connection refused 代码如下: func submitForm(value string){ resp, err := http.PostForm("h

我正在尝试向运行PHP应用程序的端口8080上的本地主机发送post请求

我的工作很好:

curl --data "key=asdf" http://localhost:8080/
但在Go中,我得到以下错误:

Post http://localhost:8080: dial tcp 127.0.0.1:8080: connection refused
代码如下:

func submitForm(value string){
    resp, err := http.PostForm("http://localhost:8080", url.Values{"key": {value}})
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    _, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("status = ",resp.Status)
}
submitForm("asdf")
我用httpry监视http流量,发现没有生成http请求,但有一些包:

4 packets received, 0 packets dropped, 0 http packets parsed
还有一些事实:

  • 我的操作系统是Linux
  • 我使用PHP的内置web服务器。服务器是用以下命令启动的:

    php-S localhost:8080

这个问题似乎在Go 1.6中得到了解决。以下是原始答案供参考。


这里的问题是Go的net.Dialer在默认情况下只进行IPv4连接(这似乎是一个bug),但您的PHP服务器只在IPv6上侦听

当您运行
php-S localhost:8080
时,它正在做(大部分)正确的事情,并绑定到IPv6地址
::1
。它不绑定到IPv4

这对于大多数软件来说都不是问题,但是当您调用http.PostForm()时会发生的情况是,net.http使用其,默认情况下,它使用拨号()来建立传出连接。Dial()尝试解析地址,然后我们深入到src/net/ipsock.go中的解析程序中,我们发现go开发人员在尝试解决其他问题时故意将其搞糟:

        // We'll take any IP address, but since the dialing
        // code does not yet try multiple addresses
        // effectively, prefer to use an IPv4 address if
        // possible. This is especially relevant if localhost
        // resolves to [ipv6-localhost, ipv4-localhost]. Too
        // much code assumes localhost == ipv4-localhost.
这显然是一个问题,因为IPv6应该是默认和首选协议。Linux和PHP运行正常,而Go本身则不正常

上述评论可在1.4分支中找到。在主分支中,这已被完全重写,但在新代码中,IPv6或IPv4地址是首选地址并不明显。它很可能是不确定的;我没有花太多时间看它。根据我在GitHub上发现的问题,(见下文),它不太可能得到实际修复

同时,您可以通过连接到
::1
或将PHP绑定到
127.0.0.1
来解决此错误。您也可以使用正确的行为构建自己的往返程序,但这可能太费事了,除非您在访问支持IPv6的服务时遇到问题(最终我们都会遇到问题,所以这确实需要解决)

一些相关的Go问题包括:

  • (此问题的正确解决方案)
  • (这就是您面临的问题)
  • (与您的问题密切相关)

还有其他一些老问题,因为代码已经重写很久了,所以不再相关…

这段代码对我来说很好。如何调用
submitForm
,如何启动php服务器?服务器和这个go代码运行在同一台机器上,对吗?我这样称呼它:submitForm(“asdf”)服务器是在同一台机器上启动的,如下所示:php-S localhost:8080你认为这是php(不是go)的错吗?可能是。什么版本的php?比较curl和go之间的http请求可能会很有趣,看看php服务器要查找的头是否有差异。php 5.6.4如何查看http请求?在php中打印$u POST将无法工作,因为请求被拒绝。对,我认为您可能可以打印go请求,但您不能,因为您使用PostForm。我不知道如何使php服务器更详细。Get或Post功能是否正常工作?您是否尝试过使用较低级别的go函数构建请求,如本文所述?