# Day 15 : Golang Gin(1) - 簡單HTTP Request
## Getting and Run Gin
第一次使用可以透過 `go get -u github.com/gin-gonic/gin` 進行安裝
接下來就是使用Gin拉,首先透過`router := gin.Default()`建立預設的路由引擎,這用來之後增加middleware和處裡請求,且由於Gin有支援RESTful,可以直接透過`router.`的方式來執行各種HTTP請求,最後透過router.Run(":8080")讓路由器在8080 port運轉。
其中關於Context的定義可以參考[官方文件](https://pkg.go.dev/github.com/gin-gonic/gin@v1.9.0#Context)。
```go!
package main
import "github.com/gin-gonic/gin"
func main(){
router := gin.Default()
router.GET("/user",user)
router.POST("/user/:id",addUser)
router.Run(":8080")
}
func user(c *gin.Context){
c.JSON(200,gin.H{
"name":"dylan",
})
}
func addUser(c *gin.Context){
id := c.Param("id")
c.JSON(200,gin.H{
"id":id,
"name":"dylan",
})
}
```
使用postman看到,使用POST 請求到/member/:id,可以回傳正確的結果

(圖一,參考來源:Postman)
## HTTP GET、POST、DELETE、PUT
這邊依照RESTful API的風格設計檢的新增刪除使用者的API,可以讓我們由路由就知道要對資料進行什麼操作。
接下來會新增三個檔案,分別是User.go、UserService.go、UserRouter.go,僅將main.go當作程式執行的入口
:::info
│ go.mod
│ go.sum
│ main.go
│
├─models
│  User.go
│
├─service
│  UserService.go
│
├─route
│  UserRouter.go
:::
下面為修改過後的main.go和新增的UserRouter.go。
在main.go都過Group將路由做分配,如果是`"/api"`路徑開頭的全部放到`api`這個路由組。接著將定義好的`api`路由組當作參數,傳遞給AddUserRouter()函式,這裡面會定義如何再根據不同的路由規則,回應不同的handler function。
```go=
// main.go
package main
import (
"golangGinPractice/route"
"github.com/gin-gonic/gin"
)
func main(){
router := gin.Default()
api := router.Group("/api")
route.AddUserRouter(api)
router.Run(":8080")
}
```
```go=
// UserRouter.go
package route
import (
"github.com/gin-gonic/gin"
"golangGinPractice/service"
)
func AddUserRouter(r *gin.RouterGroup) {
user := r.Group("/users")
user.GET("/", service.FindAllUsers)
user.POST("/",service.PostUser)
user.DELETE("/:id",service.DeleteUser)
user.PUT("/:id",service.PutUser)
}
```
User.go 用結構體定義一個我們需要的類別。
```go=
// User.go
package models
type User struct {
Id int `json:"UserId"`
Name string `json:"UserName"`
Password string `json:"UserPassword"`
Email string `json:"UserEmail"`
}
```
handler function都記錄在UserService.go檔案
```go=
// UserService.go
package service
import (
"golangGinPractice/models"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
)
var userList = []models.User{}
// Get user
func FindAllUsers(c *gin.Context) {
c.JSON(http.StatusOK, userList)
}
// Post user
func PostUser(c *gin.Context) {
user := models.User{}
err := c.BindJSON(&user)
if err != nil {
c.JSON(http.StatusNotAcceptable, "Error :"+err.Error())
}
userList = append(userList, user)
c.JSON(http.StatusOK, "Successfully posted")
}
// Delete user
func DeleteUser(c *gin.Context) {
userId, _ := strconv.Atoi(c.Param("id"))
for index, user := range userList {
if userId == user.Id {
userList = append(userList[:index], userList[index+1:]...)
c.JSON(http.StatusOK, "Successfully deleted")
return
}
}
c.JSON(http.StatusGone, "Error")
}
// Put user
func PutUser(c *gin.Context) {
updateUser := models.User{}
err := c.BindJSON(&updateUser)
if err != nil {
c.JSON(http.StatusNotAcceptable, "Error :"+err.Error())
}
userId, _ := strconv.Atoi(c.Param("id"))
for index, user := range userList {
if userId == user.Id {
userList[index] = updateUser
c.JSON(http.StatusOK, "Successfully updated")
return
}
}
c.JSON(http.StatusNotFound, "Error")
}
```
接下來透過下面gif檔案顯示透過Postman執行各個路由的結果

## Referencs
1. https://github.com/gin-gonic/gin
2. https://www.youtube.com/playlist?list=PLKDLBB0AVnh66JwQA9nWLwoncG96vkE2N
3. https://ithelp.ithome.com.tw/articles/10275626
4. https://ithelp.ithome.com.tw/articles/10269133
###### tags: `About Go`