2.フォーム画面よりGET送信。リクエストパラメータの扱い

カテゴリー: 学習  閲覧数:345 配信日:2017-12-31 10:24


コード


フォーム表示のハンドラ
・HandleHelloFormGet()

POST用のハンドラ
・HandleHelloPost()
・HandleAPIHelloPost()

クエリーパラメータ処理を追記
・HandleHelloGet()
・HandleAPIHelloGet()

クエリーパラメータを取得
・echo.Context#QueryParam()

フォームパラメータのPOSTを受ける処理
・HandleHelloPost()

▼main.go
//中略


// 各ルーティングに対するハンドラを設定
e.GET("/", HandleIndexGet)
e.GET("/hello", HandleHelloGet)
e.POST("/hello", HandleHelloPost)
e.GET("/hello_form", HandleHelloFormGet)
e.GET("/api/hello", HandleAPIHelloGet)
e.POST("/api/hello", HandleAPIHelloPost)


//中略


// 各HTMLテンプレートに共通レイアウトを適用した結果を保存します(初期化時に実行)。
func loadTemplates() {
   var baseTemplate = "templates/layout.html"
   templates = make(map[string]*template.Template)
   templates["hello"] = template.Must(
       template.ParseFiles(baseTemplate, "templates/hello.html"))
   templates["hello_form"] = template.Must(
       template.ParseFiles(baseTemplate, "templates/hello_form.html"))
}

// HandleIndexGet は Index のGet時のHTMLデータ生成処理を行います。
func HandleIndexGet(c echo.Context) error {
   return c.Render(http.StatusOK, "hello", "world")
}

// HandleHelloGet は /hello のGet時のHTMLデータ生成処理を行います。
func HandleHelloGet(c echo.Context) error {
   greetingto := c.QueryParam("greetingto")
   return c.Render(http.StatusOK, "hello", greetingto)
}

// HandleHelloPost は /hello のPost時のHTMLデータ生成処理を行います。
func HandleHelloPost(c echo.Context) error {
   greetingto := c.FormValue("greetingto")
   return c.Render(http.StatusOK, "hello", greetingto)
}

// HandleHelloFormGet は /hello_form のGet時のHTMLデータ生成処理を行います。
func HandleHelloFormGet(c echo.Context) error {
   return c.Render(http.StatusOK, "hello_form", nil)
}

// HandleAPIHelloGet は /api/hello のGet時のJSONデータ生成処理を行います。
func HandleAPIHelloGet(c echo.Context) error {
   greetingto := c.QueryParam("greetingto")
   return c.JSON(http.StatusOK, map[string]interface{}{"hello": greetingto})
}

// HelloParam は /api/hello が受けとるJSONパラメータを定義します。
type HelloParam struct {
   GreetingTo string `json:"greetingto"`
}

// HandleAPIHelloPost は /api/hello のPost時のJSONデータ生成処理を行います。
func HandleAPIHelloPost(c echo.Context) error {
   param := new(HelloParam)
   if err := c.Bind(param); err != nil {
       return err
   }
   return c.JSON(http.StatusOK, map[string]interface{}{"hello": param.GreetingTo})
}


▼template/hello_form.html
{{define "content"}}
<form action="/hello" method="POST">
   <label for="greetingto">Greeting To: </label>
   <input type="text" id="greetingto" name="greetingto" />
   <input type="submit" />
</form>
{{end}}


実行


$ cd /home/★★/go/src/try-using-echo/chapter-2
$ go run main.go

  ____    __
 / __/___/ /  ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.2.5
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                   O\
⇨ http server started on [::]:☆☆


ブラウザ表示GET /hello?greetingto=xxx


クエリーパラメータで受け取った「greetingto」パラメータをテンプレートに埋め込み、「Hello xxx!」文字列をHTMLで出力する

・ブラウザで「http://グローバルIPアドレス:☆☆/hello?greetingto=xxx」へアクセス
Hello xxx!

・ブラウザで「http://グローバルIPアドレス:☆☆/hello?greetingto=brown」へアクセス
Hello brown!

・ブラウザで「http://グローバルIPアドレス:☆☆/hello?greetingto=%E4%BD%90%E8%97%A4」へアクセス
Hello 佐藤!

ブラウザ表示GET /api/hello?greetingto=xxx


クエリーパラメータで受け取った「greetingto」パラメータより、以下のJSONを返す

・ブラウザで「http://グローバルIPアドレス:☆☆/api/hello?greetingto=xxx」へアクセス
{"hello":"xxx"}

・ブラウザで「http://グローバルIPアドレス:☆☆/api/hello?greetingto=brown」へアクセス
{"hello":"brown"}

・ブラウザで「http://グローバルIPアドレス:☆☆/api/hello?greetingto=%E4%BD%90%E8%97%A4」へアクセス
{"hello":"佐藤"}

ブラウザ表示GET /hello_form


フォーム入力欄を画面出力する
・ブラウザで「http://グローバルIPアドレス:☆☆/hello_form」へアクセス
・画面表示内容
Greeting To:フォーム入力欄「送信」

ブラウザ表示POST /hello


hello_formよりPOSTされた「greetingto」パラメータをテンプレートに埋め込み、Hello xxx!の文字列をHTMLで出力する

ブラウザで「http://グローバルIPアドレス:☆☆/hello_form」へアクセス
「Golang」と入力後、送信ボタンクリック
・「http://グローバルIPアドレス:ポート番号/hello」へ画面遷移
・画面表示
Hello Golang!

ブラウザで「http://グローバルIPアドレス:☆☆/hello_form」へアクセス
「佐藤」と入力後、送信ボタンクリック
・「http://グローバルIPアドレス:ポート番号/hello」へ画面遷移
・画面表示
Hello 佐藤!


Go言語のWebフレームワーク「Echo」を使ってみる ②(リクエストパラメータの扱い)