2012-10-06 17 views
17

私は、Goを使用してウェブサイトにログインし、後で使用するためにクッキーを保存しようとしています。HTTPポストに移動してクッキーを使用する

フォームを投稿し、Cookieを保存し、Cookieを使用して別のページにアクセスするためのサンプルコードを教えてください。

私は私はあなたがhttp.CookieJarインターフェイスを実装する必要があります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? 

} 
+1

残念ながら標準クッキー 'Jar'のimplemntationはGO1にそれをしなかったが、それは将来の追加のために計画されているように見えます:https://codereview.appspot.com/5544082/ –

+0

は、HTTPを使用して見て: //www.gorillatoolkit.org/pkg/sessions – elithrar

答えて

39

ゴー1.1は、クッキージャーの実装net/http/cookiejarを導入しました。

import (
    "net/http" 
    "net/http/cookiejar" 
) 

cookieJar, _ := cookiejar.New(nil) 

client := &http.Client{ 
    Jar: cookieJar, 
} 
14

ファーストを研究することによって、クッキーを保存するためのクライアントを作成する必要があるかもしれないと思います。作成したクライアントにこれを渡すことができ、クライアントで作成された要求に使用されます。基本的な例として:

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)) 
} 
+0

おそらく、cookie jarのホスト名をキーにしたマップを使用するべきです。一般的な解決策のために –

+0

が合意されました。これはブラウザの仕組みと似ていますが、最終的に実装の詳細に依存します。 – dskinner

+0

"CookieJarの実装は、複数のゴルーチンによる同時使用のために安全でなければなりません。これは並行性には安全ではありません。これがあなたのクッキーを他のホストに送るという事実は言うまでもありません。私はdownvoteに行くつもりです。 –

5

Goのバージョン1.5では、http.NewRequestを使用して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)); 
}   
0

もう1つの方法です。 Go 1.8で動作します。

expiration := time.Now().Add(5 * time.Minute) 
    cookie := http.Cookie{Name: "myCookie", Value: "Hello World", Expires: expiration} 
    http.SetCookie(w, &cookie)