2016-08-14 6 views
0

Я пытаюсь получить информацию со старого сайта, который использует файлы cookie HTTP-файлов netscape для входа в систему. Вот мои локоны запросы:Curl with cookies to Golang HTTP-запрос

// Do login request and get cookie 
curl -c cookies -X POST -i -v https://foobar.com/login 

// Use generated cookie file to get more data about the user 
curl -b cookies -i -v https://foobar.com/data 

В PHP, вы могли бы сделать что-то вроде:

// Do login request and get cookie 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'https://foobar/login'); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, './cookies'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookies'); 
$user = curl_exec($ch); 

// Use generated cookie file to get data about the user 
curl_setopt($ch, CURLOPT_URL, 'https://foobar/login'); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, './cookies'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookies'); 
$data = curl_exec($ch); 

есть способ сделать это, используя HTTP пакета ИПП в Go?

+0

Используйте [ 'http.CookieJar'] (http://golang.org/pkg/net/http/#Cookie Jar) для управления куки-файлами между несколькими запросами. Для ознакомления см. Родственный вопрос [В чем разница между cookie и cookiejar?] (Http://stackoverflow.com/questions/31270461/what-is-the-difference-between-cookie-and-cookiejar) – icza

ответ

2

Чтобы сохранить печенье:

// do whatever is needed to login and get the cookie 
response, err := http.PostForm("http://localhost:8080/login", url.Values{"username": {"foo"}, "password": {"bar"}}) 
if err != nil { 
    log.Fatal(err) 
} 

var savedCookie *http.Cookie 

for _, cookie := range response.Cookies() { 
    if cookie.Name == "secret" { 
     savedCookie = cookie 
    } 
} 

После того, как у вас есть печенье можно построить еще один запрос и добавить печенье (ы):

client := http.Client{} 
request, err := http.NewRequest("GET", "http://localhost:8080/protected", nil) 
if err != nil { 
    log.Fatal(err) 
} 

request.AddCookie(savedCookie) 
response, err := client.Do(request) 
if err != nil { 
    log.Fatal(err) 
} 

Если у вас есть несколько Cookies Вы можете использовать CookieJar и установить их непосредственно в клиенте:

client := &http.Client{ 
    Jar: jar, 
} 
+0

Отличное объяснение, спасибо ! – asing