2016-07-27 47 views
0

我試圖端口某件事我寫的節點,請求看起來像這樣的節點(JS):不從Golang http請求得到Location頭

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)我可以看到一個位置標題。

我曾經想我可能最好的方式,我結束了創建此圍棋:

// 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標題,但由於某種原因,我只是不能得到我正在尋找的位置標題。

我真的看不到Node r equest,vs Go請求,但是任何幫助都會很棒,因爲我在最後一天一直在我的頭上跳牆。謝謝。

回答

1

您可以在resp, err = newClient.Do(req)之後通過檢查resp.Request.URL來獲取該網址。沒有一種非常簡單的方法可以忽略重定向,您可以通過http.RoundTripper進行手動呼叫,也可以在客戶端上設置CheckRedirect函數,但這並不理想。

+0

調用round tripper來忽略重定向與調用客戶端Do方法一樣簡單:'resp,err:= http.DefaultTransport.RoundTrip(req)' –

+0

但是,請注意,這意味着Cookie不會被添加到餅乾罐,你必須解析並手動添加它 –

+0

哦,我錯過了餅乾。是的,這並不簡單。 –