質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

解決済

GO言語で新しいリクエストを送信した時、セッションを維持する方法を教えてください。

削除済ユーザー
削除済ユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

2回答

0評価

0クリップ

3946閲覧

投稿2017/07/03 12:49

編集2022/01/12 10:58

###前提・実現したいこと
Go言語のGorillaを使ってセッションを管理しています。
クライアント側からサーバ側に新しいリクエストを生成して送信した場合、前回保存したセッション情報を読み込むことができませんでした。
この場合、セッションの維持する方法を教えてください。

###発生している問題・エラーメッセージ

エラーメッセージは特にありません。

###該当のソースコード

go

// Client側 package main import \( "io/ioutil" "log" "net/http" "github\.com/gorilla/mux" "github\.com/gorilla/securecookie" "github\.com/gorilla/sessions" \) var \( store \*sessions\.CookieStore = sessions\.NewCookieStore\(securecookie\.GenerateRandomKey\(64\)\) session \*sessions\.Session SessionName = "client" \) func main\(\) { store\.Options = &sessions\.Options{ Path: "/", MaxAge: 60 \* 15, Secure: false, HttpOnly: true, } router := mux\.NewRouter\(\) router\.HandleFunc\("/", cIndex\) router\.HandleFunc\("/test", cTest\) http\.ListenAndServe\(":7000", router\) } func cIndex\(w http\.ResponseWriter, r \*http\.Request\) { session, err := store\.Get\(r, SessionName\) if err != nil { log\.Println\("Client Error 1 : ", err\.Error\(\)\) } session\.Values\["foo"\] = "bar" session\.Save\(r, w\) w\.Header\(\)\.Set\("Location", "http://localhost:8080\?foo=bar"\) w\.Header\(\)\.Set\("Content-Type", "application/x-www-form-urlencoded"\) w\.WriteHeader\(http\.StatusFound\) } func cTest\(w http\.ResponseWriter, r \*http\.Request\) { req, err := http\.NewRequest\("GET", "http://localhost:8080/test", nil\) if err != nil { log\.Println\("Client Error 2 : ", err\.Error\(\)\) } req\.SetBasicAuth\("sample_id", "sample_secret"\) // req\.Header\.Set\("Location", provider\.TokenEP\+"\?"\+t\.encode\(\)\) req\.Header\.Set\("Content-Type", "application/x-www-form-urlencoded"\) c := &http\.Client{ Transport: &http\.Transport{}, } resp, err := c\.Do\(req\) if err != nil { log\.Println\("Client Error 3 : ", err\.Error\(\)\) } defer resp\.Body\.Close\(\) body, err := ioutil\.ReadAll\(resp\.Body\) if err != nil { log\.Println\("Client Error 4 : ", err\.Error\(\)\) } log\.Println\(string\(body\)\) }
// サーバ側 package main import \( "encoding/json" "log" "net/http" "github\.com/gorilla/mux" "github\.com/gorilla/securecookie" "github\.com/gorilla/sessions" \) var \( store \*sessions\.CookieStore = sessions\.NewCookieStore\(securecookie\.GenerateRandomKey\(64\)\) session \*sessions\.Session SessionName = "server" \) func main\(\) { store\.Options = &sessions\.Options{ Path: "/", MaxAge: 60 \* 15, Secure: false, HttpOnly: true, } router := mux\.NewRouter\(\) router\.HandleFunc\("/", sIndex\) router\.HandleFunc\("/test", sTest\) http\.ListenAndServe\(":8080", router\) } func sIndex\(w http\.ResponseWriter, r \*http\.Request\) { r\.ParseForm\(\) v := r\.FormValue\("foo"\) session, err := store\.Get\(r, SessionName\) if err != nil { log\.Println\("Server Error 1 : ", err\.Error\(\)\) } session\.Values\["foo"\] = v session\.Save\(r, w\) w\.Header\(\)\.Set\("Location", "http://localhost:7000/test"\) w\.Header\(\)\.Set\("Content-Type", "application/x-www-form-urlencoded"\) w\.WriteHeader\(http\.StatusFound\) } func sTest\(w http\.ResponseWriter, r \*http\.Request\) { session, err := store\.Get\(r, SessionName\) if err != nil { log\.Println\("Server Error 2 : ", err\.Error\(\)\) } v, ok := session\.Values\["foo"\]\.\(string\) if !ok { log\.Printf\("foo = %v\\n", v\) } data := struct { Foo string }{ v, // I want v is bar } bytes, err := json\.Marshal\(data\) if err != nil { log\.Println\("Server Error 3 : ", err\.Error\(\)\) } w\.Header\(\)\.Set\("Content-Type", "application/json"\) w\.WriteHeader\(http\.StatusOK\) w\.Write\(bytes\) }

###試したこと
① クライアント側でhttp\.Clientを生成する時、http\.Transportも生成してリクエストを送信する。(c := &http\.Client{Transport:&http\.Transport{}})
② リクエスト生成後、コンテキストを使用してリクエスト送信する。(req = request\.WithContext\(context\.BackgroundContext\(\)\))

###補足情報(言語/FW/ツール等のバージョンなど)
特にありません。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。