首页 > 解决方案 > Go 的 http 库和 Postman 的结果不同——Postman 可以工作,但 Go 不能

问题描述

再会。我正在尝试用 Go 抓取这个 URL: http://us2.m2web.talk2m.com/valleycarriers/Gorman%20Bros/usr/viewon/Overview.shtm

链条上有一个裂缝。我可以简单地向这个端点发送一个带有必要参数的 POST 请求,就像 Chrome 所做的那样,但即使 Chrome 这样做了,它也会在地址栏上弹出一个窗口,一个浏览器窗口,询问用户名和密码。因为Cache-Clear响应头是must-revalidate.

所以我解雇了邮递员。并发送了一个 POST 相同的 url,但像这样:

https`://username:password@url

它返回了三个 cookie。我将这三个 cookie 提供给提供所需数据的端点:

https://u:p@us2.m2web.talk2m.com/valleycarriers/Gorman Bros/rcgi.bin/vows/readVars

并得到了结果!

Postman 在发送第一个请求后连续发送两个请求。

我试图在 Go 中替换它:

loginString := "account=valleycarriers&username=u&password=p&connect=connect&attempt=0"

requestLogin, err := http.NewRequest("POST", "http://u:p@us2.m2web.talk2m.com/valleycarriers/Gorman%20Bros/usr/viewon/Overview.shtm", strings.NewReader(loginString))
    if err != nil {
        log.Fatal(err)
    }

requestLogin.Header.Add("Content-Type", "application/x-www-form-urlencoded")
requestLogin.Header.Add("Content-Length", "87")
requestLogin.Header.Add("Host", "us2.m2web.talk2m.com")
requestLogin.Header.Add("Authorization", "Basic b3BlcmF0b3I6b3BlcmF0b3IxMjM=")

但是这个请求不起作用。它返回两个 cookie,但 Postman 返回三个。Postman 不返回正文,但返回登录页面。在 Postman 中,如果我将 cookie 从第一个请求传递到第二个请求,它会返回我想要的数据。但在 Go 中,它只是再次返回登录页面。

我尝试使用 Fiddler 检查来自 Go 的传出流量,但与 Postman 不同的是,Fiddler 不显示来自此端点的任何流量。

谢谢。

标签: httpgorequestpostmanendpoint

解决方案


如果我可以发表评论,我会说,但我会说作为答案,我发现 Postman 中的 Code->{language} 选项非常有用。如果您单击 Postman 桌面“保存”下的“代码”文本,它会将您请求的每一位转换为您选择的语言的通常准确的代码。

邮递员代码转换

如果没有看到您的 Postman 示例、完整的 Go 代码或错误/状态代码,我很难找出问题所在。这可能是对您的问题投反对票的原因。如果您可以发布这些内容并且 Postman 自动生成的代码不能解决您的问题,我可以查看具体案例并尝试调试问题,但请先尝试这些步骤。


推荐阅读