go - 无法从 cookiejar 获取 cookie
问题描述
我在网站上构建了一个简单的脚本,并在那里做了一些事情(在 lego.com 上自动结帐过程)
这一切都是使用带有 cookiejar 的 go http 客户端完成的,但是当我尝试在网站上的所有活动之后打印出 cookie 时,什么都没有打印 - 不确定我是否在这里做错了。
type Program struct {
taskInfo task.Task
client http.Client
jar *cookiejar.Jar
// Task Specific Variables
maxOrderQty string
sessionID string
sku string
shipMethodUID string
}
HTTP客户端在下面初始化
func (pr *Program) initializeClient() {
pr.jar, _ = cookiejar.New(nil)
pr.client = http.Client{
Timeout: time.Second * 10,
Jar: pr.jar,
}
}
之后,我使用所述客户端对同一个域(GET 和 POST 的混合)进行了几次调用。当我尝试打印出 cookie 时,什么也没有打印出来。
func (pr *Program) getSessionCookies() {
log.Debug("Getting Cookies")
u, _ := url.Parse("https://www.lego.com/")
for _, cookie := range pr.jar.Cookies(u) {
fmt.Printf(" %s: %s\n", cookie.Name, cookie.Value)
}
}
解决方案
Go 的 http 包默认支持重定向,但必须刷新 cookie jar,特别是在域更改时。
前段时间我花了很多时间调试它,我找到的解决方案是指定一个重定向处理程序:
client.CheckRedirect = getRedirectHandler(req, &client)
其中有以下代码:
func getRedirectHandler(req *Request, client *http.Client) redirectHandler {
fn := func(request *http.Request, via []*http.Request) error {
if req.FollowRedirect {
log.Debug(fmt.Sprintf("Redirecting to %s", request.URL.String()))
jar, err := getCookieJarWithURL(request.URL.String(), req.Cookies)
if err != nil {
return err
}
client.Jar = jar
return nil
}
return errors.New("Redirect not allowed")
}
return fn
}
完整的代码可以在这个gist中找到:
我希望这可以节省你一些时间:)
推荐阅读
- python - 在 Visual Studio Code 中将焦点切换到 Jupyter (IPython) 终端
- java - 将未实现的接口转换为对象
- pytorch - RuntimeError:仅支持作为 JIT 输入的元组、列表和变量,但得到了 NoneType
- python - Unable to attach tensorboard callback in tensorflow keras
- java - 一对多的订单与 case hibernate spring
- javascript - How to make Fabric js reactive using Vue js?
- elasticsearch - 如何将弹性搜索索引的所有文档卸载到 json 文件中?
- react-native - 如何使用原生基础将线性渐变应用到页眉。(反应原生)
- xml - Odoo 9: How to have a field displayed in edit form but not in the standard view?
- ajax - Ajax 响应让我获得了整个 html 页面