Cloud Foundry 中的 Golang 拨号器
Golang Dialer in Cloud Foundry
我正在尝试访问一个 URL,它给我一个 JSON 响应,并且说 URL 只有在我连接到我公司的 VPN 时才能访问。
使用标准 Golang 库,即使我连接到我公司的 VPN,下面的代码也会出错:
myClient := &http.Client{}
req, err := http.NewRequest("POST", "https://mysite/getJSONResponse", nil)
req.Header.Add("myHeader", "myHeaderValue")
resp, err := myClient.Do(req)
这是我收到的错误:
502 Bad Gateway: Registered endpoint failed to handle the request.
但是,当我连接到我公司的 VPN 时,此代码(也来自标准库)能够获得 JSON 响应:
envDialer := proxy.FromEnvironment()
myTransport := &http.Transport{Dial: envDialer.Dial}
myClient := &http.Client{Transport: myTransport}
req, err := http.NewRequest("POST", "https://mysite/getJSONResponse", nil)
req.Header.Add("myHeader", "myHeaderValue")
resp, err := myClient.Do(req)
我的问题是,当我将工作代码推送到 Cloud Foundry(它也连接到我公司的 VPN)时,我的代码却出现以下错误:
Post https://mysite/getJSONResponse: read tcp 10.254.2.182:45320->165.156.25.94:443:
read: connection reset by peer
好像代码无法连接到我公司的 VPN,即使它已经被推送到 Cloud Foundry,这就是 URL 拒绝给出 JSON 响应的原因。
但是,当我尝试使用使用 Beego 框架的测试 Web 应用程序访问 Cloud Foundry 中的相同 URL 时,它能够很好地获得 JSON 响应。
我应该提一下,即使未设置 http_proxy、https_proxy 和 no_proxy 环境变量,Beego 版本也能正常工作:
req := httplib.Post("https://mysite/getJSONResponse")
req.Header("myHeader", "myHeaderValue")
str, err := req.String()
if err != nil {
fmt.Println(err)
}
beego.Info(str)
u.Data["json"] = str
u.ServeJSON()
我的问题是:
为什么第二个标准库代码在本地运行良好,但推送到 Cloud Foundry 时却不行?
Beego 框架在幕后做了什么,让它在 Cloud Foundry 上连接到我公司的 VPN,标准库也能做到这一点吗?
我有一种感觉,Beego 正在对其 Proxy/Port 设置做些什么,以使其能够连接到我们公司的 VPN。
我真的不想为了连接我们公司的VPN而将我们的后端代码与Beego框架集成在一起。我一定是遗漏了一些可以用标准库完成的非常简单的东西。有什么想法吗?
我终于设法只使用 beego/httplib
包让它工作,所以没有必要集成整个 Beego 框架(谢天谢地)。这是我的代码:
import (
"github.com/astaxie/beego/httplib"
)
-----------------------------------------------------
req := httplib.Post("https://mysite/getJSONResponse")
req.Header("myHeader", "myHeaderValue")
str, err := req.String()
if err == nil {
strBytes := []byte(str)
// Do something with the JSON response.
}
我没有时间研究是什么让 httplib
包起作用,虽然我 已经 看到它只使用标准库来拨打适当的连接提出要求。有人可以帮忙解释一下吗?
编辑:我看到它使用 crypto/tls
包的 *tls.Config
来建立与适当证书的连接。这可能是它发出连接到我们 VPN 的请求的方式。
我正在尝试访问一个 URL,它给我一个 JSON 响应,并且说 URL 只有在我连接到我公司的 VPN 时才能访问。
使用标准 Golang 库,即使我连接到我公司的 VPN,下面的代码也会出错:
myClient := &http.Client{}
req, err := http.NewRequest("POST", "https://mysite/getJSONResponse", nil)
req.Header.Add("myHeader", "myHeaderValue")
resp, err := myClient.Do(req)
这是我收到的错误:
502 Bad Gateway: Registered endpoint failed to handle the request.
但是,当我连接到我公司的 VPN 时,此代码(也来自标准库)能够获得 JSON 响应:
envDialer := proxy.FromEnvironment()
myTransport := &http.Transport{Dial: envDialer.Dial}
myClient := &http.Client{Transport: myTransport}
req, err := http.NewRequest("POST", "https://mysite/getJSONResponse", nil)
req.Header.Add("myHeader", "myHeaderValue")
resp, err := myClient.Do(req)
我的问题是,当我将工作代码推送到 Cloud Foundry(它也连接到我公司的 VPN)时,我的代码却出现以下错误:
Post https://mysite/getJSONResponse: read tcp 10.254.2.182:45320->165.156.25.94:443:
read: connection reset by peer
好像代码无法连接到我公司的 VPN,即使它已经被推送到 Cloud Foundry,这就是 URL 拒绝给出 JSON 响应的原因。
但是,当我尝试使用使用 Beego 框架的测试 Web 应用程序访问 Cloud Foundry 中的相同 URL 时,它能够很好地获得 JSON 响应。
我应该提一下,即使未设置 http_proxy、https_proxy 和 no_proxy 环境变量,Beego 版本也能正常工作:
req := httplib.Post("https://mysite/getJSONResponse")
req.Header("myHeader", "myHeaderValue")
str, err := req.String()
if err != nil {
fmt.Println(err)
}
beego.Info(str)
u.Data["json"] = str
u.ServeJSON()
我的问题是:
为什么第二个标准库代码在本地运行良好,但推送到 Cloud Foundry 时却不行?
Beego 框架在幕后做了什么,让它在 Cloud Foundry 上连接到我公司的 VPN,标准库也能做到这一点吗?
我有一种感觉,Beego 正在对其 Proxy/Port 设置做些什么,以使其能够连接到我们公司的 VPN。
我真的不想为了连接我们公司的VPN而将我们的后端代码与Beego框架集成在一起。我一定是遗漏了一些可以用标准库完成的非常简单的东西。有什么想法吗?
我终于设法只使用 beego/httplib
包让它工作,所以没有必要集成整个 Beego 框架(谢天谢地)。这是我的代码:
import (
"github.com/astaxie/beego/httplib"
)
-----------------------------------------------------
req := httplib.Post("https://mysite/getJSONResponse")
req.Header("myHeader", "myHeaderValue")
str, err := req.String()
if err == nil {
strBytes := []byte(str)
// Do something with the JSON response.
}
我没有时间研究是什么让 httplib
包起作用,虽然我 已经 看到它只使用标准库来拨打适当的连接提出要求。有人可以帮忙解释一下吗?
编辑:我看到它使用 crypto/tls
包的 *tls.Config
来建立与适当证书的连接。这可能是它发出连接到我们 VPN 的请求的方式。