我目前正在尝试将一个小应用程序从nodejs转换为golang(因此是两个标签),但这样做会遇到一些麻烦。
基本上这是一个非常简单的http POST登录,我似乎无法实现。背景是我的大学提供日历导出功能,我想将此日历作为可添加到Google Cal的Feed提供。
现在问题是我在节点中完成了整个工作,但我真的希望能够实现它。
节点代码的重要部分是
var query = url.parse(req.url, true).query;
var data = {
u: query.user, // Username
p: query.password, // Password
};
needle.post(LOGIN_URL, data, {}, function (error, response) {
//extract cookies etc.
});
这就像魅力一样,但如果我试着去做那个
import "github.com/parnurzeal/gorequest"
//...
resp, body, err := gorequest.New().Post(LOGIN_URL).Send("u=user&p=pass").End()
//extract cookies etc.
我结束了无效(超时)会话。我已经尝试在go中使用net / http,这似乎没有任何改变。
POST请求产生的结果是302重定向到概述页面(顺便说一下:它是基于ASP的)。可能是因为这导致了问题,因为gorequest然后在没有resp返回的cookie的情况下获取该概述页面,有效地创建了一个未授权的新会话,或者我忽略了一些非常简单的东西?
答案 0 :(得分:0)
因此,我似乎通过遵循您的建议并使用" net / http"来找到答案。并深入研究http.Client实际上做了什么。对于可能遇到类似问题的人,这是我的解决方案:
如果服务器see documentation收到30x响应,http.Client会自动重定向。虽然可以覆盖重定向策略,但我无法完全阻止重定向。
此外,似乎客户端有一个错误(至少我称之为),因为它会在重定向see the issue或in the source时删除所有标头,其中会创建新标头。
在net / http中搜索时,我找到了http.DefaultTransport,它由http.Client使用,不会重定向。它似乎有点低级,正是我追求的。下面的代码演示了我如何用上面的gorequest替换了实现的行:
data := url.Values{"u": {USER}, "p": {PASS}}
req, err := http.NewRequest("POST", LOGIN_URL, bytes.NewBufferString(data.Encode()))
//I needed quite some time to figure out that I needed to set the content type accordingly
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
//...
resp, err := http.DefaultTransport.RoundTrip(req)
//...
//resp.Header["Set-Cookie"] now contains the login/session cookies
虽然我需要自己提取cookie并设置一些标题值,但解决方案完美无缺,我对此非常满意。如果有人对我的解决方案或任何其他建议有所改进,我很高兴听到它。感谢JimB和Volker:)。