未从Golang http请求中获取Location标头



我正试图移植我在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);
  });
}

如果I console.log(resp.headers),我可以看到位置标头。

我试图在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 Googlen Details: nn Username: %sn Password: %sn AuthType: %sn", 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 requestn")
}
resp.Body.Close()

但当我log.Println(resp.Location())时,我得到了<nil>

我真的不确定这里有什么区别(我试过使用和不使用Content-Type标头,但由于某种原因,我无法获得我想要的Location标头。

我真的看不出Node请求和Go请求之间有什么不同,但任何帮助都会很好,因为我在最后一天一直在努力。谢谢

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

最新更新