フレームワーク「GIN」を使ってみた（リクエストパラメータ）


#パラメータの取得

以下の形式から、パラメータを取得する

http://localhost:8080/hello?name=Taro
http://localhost:8080/hello/Ziro
http://localhost:8080/api/hello?name=Saburo
http://localhost:8080/api/hello/Shiro


#フォルダ構成

```
.
├── main.go
├── asset
│   └── css
│       └── style.css
├── templates
│   ├── hello.html
│   └── layout.html
└── routes
    ├── routes.go
    └── api.go
```


#MAIN

```go:main.go:
package main

import (
	"routes"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	// 事前にテンプレートをロード 相対パス
	// router.LoadHTMLGlob("templates/*/**") などもいけるらしい
	router.LoadHTMLGlob("templates/*.html")

	// 静的ファイルのパスを指定
	router.Static("/assets", "./assets")

	// ハンドラの指定
	router.GET("/hello", routes.Hello)
	router.GET("/hello/:name", routes.HelloParam)

	// グルーピング
	user := router.Group("/api")
	{
		user.GET("/hello", routes.HelloJson)
		user.GET("/hello/:name", routes.HelloJsonPram)
	}

	router.NoRoute(routes.NoRoute) // どのルーティングにも当てはまらなかった場合に処理
	router.Run(":8080")
}
```

#ハンドラー

```go:routes/routes.go
package routes

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func Hello(c *gin.Context) {
	name := c.DefaultQuery("name", "HOGE") // HOGEはデフォルト値?
	//name := c.Query("lastname") // デフォルトがない場合
	c.HTML(http.StatusOK, "layout.html", gin.H{
		"name": name,
	})
}

func HelloParam(c *gin.Context) {
	name := c.Param("name")
	c.HTML(http.StatusOK, "layout.html", gin.H{
		"name": name,
	})
}

func NoRoute(c *gin.Context) {
	// helloに飛ばす
	c.Redirect(http.StatusMovedPermanently, "/hello")
}
```


```go:routes/api.go
package routes

import (
	"github.com/gin-gonic/gin"
)

func HelloJson(c *gin.Context) {
	name := c.DefaultQuery("name", "HOGE") // HOGEはデフォルト値?
	//name := c.Query("lastname") // デフォルトがない場合
	c.JSON(200, gin.H{
		"name": name,
	})
}

func HelloJsonPram(c *gin.Context) {
	name := c.Param("name")
	c.JSON(200, gin.H{
		"name": name,
	})
}
```

#テンプレートファイル

```html:templates/layouts.html
<html>
  <head>
    <link rel="stylesheet" href="assets/css/style.css">
    <title>Sample</title>
  </head>
  <body>
    <!-- Render the current template here -->
    {{template "content" .}}
  </body>
</html>
```


```html:templates/hello.html
{{define "content"}}
<h2>Hello {{.name}}!</h2>
{{end}}
```

#スタイルシート

```css:assets/css/style.css
h2 {
    color: red;
}
```

#実行結果

##http://localhost:8080/hello

![スクリーンショット 2019-03-27 13.01.36.png](https://qiita-image-store.s3.amazonaws.com/0/125499/44cc06e8-9212-26a1-c018-48b3cfbff985.png)

デフォルトの「HOGE」が表示される

##http://localhost:8080/hello?name=Taro

![スクリーンショット 2019-03-27 12.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/125499/427c70a1-7a6d-e6a5-4eba-cc03f7ee6208.png)

##http://localhost:8080/hello/Ziro

![スクリーンショット 2019-03-27 12.57.58.png](https://qiita-image-store.s3.amazonaws.com/0/125499/cb2fbb45-7d64-d924-3f8f-660b37d1438c.png)

**なぜか、スタイルシートが適用されない。**

##http://localhost:8080/api/hello?name=Saburo

![スクリーンショット 2019-03-27 12.59.57.png](https://qiita-image-store.s3.amazonaws.com/0/125499/a27c6bb8-52a2-582d-763b-3e842aaef391.png)

##http://localhost:8080/api/hello/Shiro

![スクリーンショット 2019-03-27 13.00.56.png](https://qiita-image-store.s3.amazonaws.com/0/125499/ddbe7cda-5474-7dd3-e1f8-b264559d37f5.png)