gpt4 book ai didi

go - 没有从 Golang http 请求中获取 Location header

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:59 24 4
gpt4 key购买 nike

我正在尝试移植我在 Node 中编写的内容,请求在 Node(JS) 中看起来像这样:

function _initialConnection(user, pass, callback) {
let opts = {
url: config.loginURL,
headers: {
"User-Agent": "niantic"
}
};

request.get(opts, (err, resp, body) => {
if (err) return callback(err, null);

console.log(resp.headers);

let data;
try {
data = JSON.parse(body);
} catch(err) {
return callback(err, null);
}
return callback(null, user, pass, data);
});
}

function _postConnection(user, pass, data, callback) {
let opts = {
url: config.loginURL,
form: {
'lt': data.lt,
'execution': data.execution,
'_eventId': 'submit',
'username': user,
'password': pass
},
headers: {
'User-Agent': 'niantic'
}
};


request.post(opts, (err, resp, body) => {
if (err) return callback(err, null);

let parsedBody;
if (body) {
try {
parsedBody = JSON.parse(body)
if (('errors' in parsedBody) && parsedBody.errors.length > 0) {
return callback(
new Error('Error Logging In: ' + paredBody.errors[0]),
null
)
}
} catch(err) {
return callback(err, null);
}
}

console.log(resp.headers)

let ticket = resp.headers['location'].split('ticket=')[1];

callback(null, ticket);
});
}

如果我console.log(resp.headers)我可以看到位置 header 。

我尝试以最好的方式在 Go 中重新创建它,我最终得到了:

// Initiate HTTP Client / Cookie JAR

jar, err := cookiejar.New(nil)
if err != nil {
return "", fmt.Errorf("Failed to create new cookiejar for client")
}
newClient := &http.Client{Jar: jar, Timeout: 5 * time.Second}

// First Request

req, err := http.NewRequest("GET", loginURL, nil)
if err != nil {
return "", fmt.Errorf("Failed to authenticate with Google\n Details: \n\n Username: %s\n Password: %s\n AuthType: %s\n", details.Username, details.Password, details.AuthType)
}
req.Header.Set("User-Agent", "niantic")
resp, err := newClient.Do(req)
if err != nil {
return "", fmt.Errorf("Failed to send intial handshake: %v", err)
}
respJSON := make(map[string]string)
err = json.NewDecoder(resp.Body).Decode(&respJSON)
if err != nil {
return "", fmt.Errorf("Failed to decode JSON Body: %v", err)
}

resp.Body.Close()

// Second Request

form := url.Values{}
form.Add("lt", respJSON["lt"])
form.Add("execution", respJSON["execution"])
form.Add("_eventId", "submit")
form.Add("username", details.Username)
form.Add("password", details.Password)
req, err = http.NewRequest("POST", loginURL, strings.NewReader(form.Encode()))
if err != nil {
return "", fmt.Errorf("Failed to send second request authing with PTC: %v", err)
}
req.Header.Set("User-Agent", "niantic")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err = newClient.Do(req)
if err != nil {
return "", fmt.Errorf("Failed to send second request authing with PTC: %v", err)
}
log.Println(resp.Location())
ticket := resp.Header.Get("Location")

if strings.Contains(ticket, "ticket") {
ticket = strings.Split(ticket, "ticket=")[1]
} else {
return "", fmt.Errorf("Failed could not get the Ticket from the second request\n")
}
resp.Body.Close()

但是当我log.Println(resp.Location())我得到 <nil>

我真的不确定这里有什么区别(我尝试过使用和不使用 Content-Type header ,但由于某种原因我无法获得我正在寻找的 Location header 。

我真的看不出 Node 请求与 Go 请求之间的差异,但任何帮助都会很棒,因为我在最后一天一直在努力工作。谢谢。

最佳答案

您可以通过在 resp, err = newClient.Do(req) 之后检查 resp.Request.URL 来获取该 url。没有真正简单的方法来忽略重定向,您可以通过 http.RoundTripper 手动调用,或者您可以在客户端设置 CheckRedirect 函数,但是这并不理想。

关于go - 没有从 Golang http 请求中获取 Location header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38602740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com