Golang HTTP Post错误:连接被拒绝
我正在尝试向运行PHP应用程序的端口8080上的本地主机发送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
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的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函数构建请求,如本文所述?