J'essaie d'utiliser Go pour me connecter à un site Web et stocker les cookies pour une utilisation ultérieure.
Pourriez-vous donner un exemple de code pour publier un formulaire, stocker les cookies et accéder à une autre page en utilisant les cookies?
Je pense que je pourrais avoir besoin de faire un client pour stocker les cookies, en étudiant http://gotour.golang.org/src/pkg/net/http/client.go
package main
import ("net/http"
"log"
"net/url"
)
func Login(user, password string) string {
postUrl := "http://www.pge.com/eum/login"
// Set up Login
values := make(url.Values)
values.Set("user", user)
values.Set("password", password)
// Submit form
resp, err := http.PostForm(postUrl, values)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// How do I store cookies?
return "Hello"
}
func ViewBill(url string, cookies) string {
//What do I put here?
}
Go 1.1 a introduit une implémentation de jar de cookies net/http/cookiejar
.
import (
"net/http"
"net/http/cookiejar"
)
cookieJar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: cookieJar,
}
Vous devez d'abord implémenter le http.CookieJar
interface. Vous pouvez ensuite le transmettre au client que vous créez et il sera utilisé pour les demandes faites avec le client. Comme exemple de base:
package main
import (
"fmt"
"net/http"
"net/url"
"io/ioutil"
"sync"
)
type Jar struct {
lk sync.Mutex
cookies map[string][]*http.Cookie
}
func NewJar() *Jar {
jar := new(Jar)
jar.cookies = make(map[string][]*http.Cookie)
return jar
}
// SetCookies handles the receipt of the cookies in a reply for the
// given URL. It may or may not choose to save the cookies, depending
// on the jar's policy and implementation.
func (jar *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) {
jar.lk.Lock()
jar.cookies[u.Host] = cookies
jar.lk.Unlock()
}
// Cookies returns the cookies to send in a request for the given URL.
// It is up to the implementation to honor the standard cookie use
// restrictions such as in RFC 6265.
func (jar *Jar) Cookies(u *url.URL) []*http.Cookie {
return jar.cookies[u.Host]
}
func main() {
jar := NewJar()
client := http.Client{nil, nil, jar}
resp, _ := client.PostForm("http://www.somesite.com/login", url.Values{
"email": {"myemail"},
"password": {"mypass"},
})
resp.Body.Close()
resp, _ = client.Get("http://www.somesite.com/protected")
b, _ := ioutil.ReadAll(resp.Body)
resp.Body.Close()
fmt.Println(string(b))
}
Dans la version 1.5 de Go, nous pouvons utiliser http.NewRequest pour faire une demande de publication avec cookie.
package main
import "fmt"
import "net/http"
import "io/ioutil"
import "strings"
func main() {
// Declare http client
client := &http.Client{}
// Declare post data
PostData := strings.NewReader("useId=5&age=12")
// Declare HTTP Method and Url
req, err := http.NewRequest("POST", "http://localhost/", PostData)
// Set cookie
req.Header.Set("Cookie", "name=xxxx; count=x")
resp, err := client.Do(req)
// Read response
data, err := ioutil.ReadAll(resp.Body)
// error handle
if err != nil {
fmt.Printf("error = %s \n", err);
}
// Print response
fmt.Printf("Response = %s", string(data));
}
Une autre façon de le faire. Fonctionne dans Go 1.8.
expiration := time.Now().Add(5 * time.Minute)
cookie := http.Cookie{Name: "myCookie", Value: "Hello World", Expires: expiration}
http.SetCookie(w, &cookie)