iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Software Development

你知道Go是什麼嗎?系列 第 17

Day17 - Gin - API Server - Golang

  • 分享至 

  • xImage
  •  

今天就來介紹一下API好了,身為準工程師的我也是第一次碰到API相關的概念,就用我理解到的方式來寫今天的內容囉。

API

開始主題吧!!

API是什麼?

Application Programming Interface,中文翻譯是應用程式介面,目的是為了讓資料可以在不同平台間交換,一端提供資料輸入、另一端依據資料回傳結果,這就是典型的API範例。通常用在網站後端與前端交換資料用。

白話解說:看到很多例子都是用餐廳做舉例,顧客與廚房透過服務生這個API做資訊交換,顧客想要餐點時拜託服務員(API)來點餐,廚房送餐時由服務員(API)來送餐給顧客。

REST API

REST全名Representational State Transfer,是一種API的軟體設計概念,用此種方式設計的API即稱為RESTful API

聽不懂對吧?我也是,以餐廳那個例子來說,傳統API時點餐、送餐、更改餐點、結帳會由不同的服務生(API)負責,但RESTful API狀況下,這些功能會統一由一位服務生完成。壓榨勞工型API

功能 傳統API RESTful API
獲取全部資料 getAllUsers /GET /users
獲取單一資料 getUser/1 /GET /user/1
新增資料 createUser /POST /user
更新資料 updateUser/1 /PUT /user/1
刪除資料 deleteUser/1 /DELETE /user/1

REST方式下,會充分使用到http的GET、POST、PUT、DELETE功能,依照請求方式差別執行不同功能。

JSON

JSONAPI最常使用的資料格式,以純文字為基底去儲存和傳送簡單結構資料,也可以透過物件或陣列來傳送較複雜的資料,可以簡單的與其他程式溝通、交換資料。

優點

  • 相容性高
  • 格式易讀、易瞭解、修改方便
  • 支援許多資料格式
  • 很多程式都內建JSON函式庫
  • 純文字檔,檔案小

試寫一下

這就算是個最基礎的API了ˊˇˋ

package main

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

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
		"message": "pong",
		})
	})
	r.Run()
}

postman輸入http://127.0.0.1:8080/ping測試一下,會看到有成功回傳JSON格式的資料。

要在postman測試本地端的話,要先下載desktop postman才能測試。

小型API server

寫個存使用者資料的程式,可以透過API觀看已存放的使用者資料、新增資料、刪除資料,沒有使用SQL因此使用Go model的方式撰寫。

功能

  • GET觀看全部使用者資料
  • GET看單一使用者資料
  • POST新增資料
  • DELETE刪除資料

結構

前面都是把大部份資料寫在main內,程式碼很亂又很難維護,這邊上網參考了一下其他前輩的API結構。

├──sample-app
│    ├── apis  
│    │    └── apiuser.go          
│    ├── models 
│    │    └── user.go       
│    └── router 
│         └──  router.go
└──main.go

  • api: 存放各種API功能
  • models: 存放各種model,本例的話是User
  • router: 路由綁定API的程式碼

user.go

創建一個全域變數Userlist模擬SQL存放資料,並有InsertDeleteUserlist操作。

package models


type User struct {
	ID          int    `json:"id"`
	Username    string `json:"name"`
	Phonenumber string `json:"phonenumber"`
}

var Userlist []User

var Index = 0

func Insert(name string, number string) {
	Index++
	temp := User{Index, name, number}
	Userlist = append(Userlist, temp)
}

func remove(slice []User, s int) []User {
    return append(slice[:s], slice[s+1:]...)
}

func Delete(id int) {
	Userlist = remove(Userlist, id-1)
}

apiuser.go

沒什麼特別的,就是API的功能

package apis

import (
	. "sample-app/models"
	"strconv"
	"github.com/gin-gonic/gin"
)

func Users(c *gin.Context) {
	for _, v := range Userlist {
		c.JSON(200, gin.H{
			"id":          v.ID,
			"name":        v.Username,
			"phonenumber": v.Phonenumber,
		})
	}
}
func SingleUser(c *gin.Context) {
	tempID := (c.Param("id"))

	id, _ := strconv.Atoi(tempID)

	temp := Userlist[id-1]
	c.JSON(200, gin.H{
		"id":          temp.ID,
		"name":        temp.Username,
		"phonenumber": temp.Phonenumber,
	})
}
func Store(c *gin.Context) {
	name, _ := c.GetPostForm("name")
	number, _ := c.GetPostForm("phonenumber")
	Insert(name, number)
	c.JSON(200, gin.H{
		"message": "insert success!",
	})

}
func Destroy(c *gin.Context) {
	tempID := (c.Param("id"))
	id, _ := strconv.Atoi(tempID)
	Delete(id)
	c.JSON(200, gin.H{
		"message": "delete!",
	})
}

router.go

綁定路由與功能,以REST方式實現

package router

import(
	"github.com/gin-gonic/gin"
	. "sample-app/apis"
)

func InitRouter() *gin.Engine{
	router := gin.Default()
	router.GET("/users", Users)
	router.GET("/user/:id", SingleUser)
	router.POST("/user", Store)
	router.DELETE("user/:id", Destroy)
	return router
}

main.go

由於程式架構分明,分工明確,所以可以看到main內相當簡潔ˊˇˋ

package main

import (
	. "sample-app/models"
	"sample-app/router"
)

var index = 4

func init() {
	Insert("Jim", "0911111111")
	Insert("Ben", "0922222222")
	Insert("Mark", "0933333333")
	Insert("Wayne", "0944444444")
}

func main() {
	router := router.InitRouter()
	router.Run(":8000")
}

完成

看一下完成畫面吧ˊˇˋ

  • 看全部資料
  • 看個別資料
  • 新增資料
  • 刪除資料

各執行完一次後再觀看全部資料

沒錯,多新增了第五筆資料,第一筆資料也被刪除了


讚讚完成了,距離鐵人賽結束只剩13天,庫存的文章昨天用完,所以現在要努力每天產文了,加油ˊˇˋ

參考資料

[API] (1) - 定義 1 - 什麼是 REST/RESTful ?
https://ithelp.ithome.com.tw/articles/10157431

API 是什麼? RESTful API 又是什麼?
https://medium.com/itsems-frontend/api-%E6%98%AF%E4%BB%80%E9%BA%BC-restful-api-%E5%8F%88%E6%98%AF%E4%BB%80%E9%BA%BC-a001a85ab638

gin+gorm+router 快速搭建 crud restful API 接口
https://learnku.com/articles/23548/gingormrouter-quickly-build-crud-restful-api-interface


上一篇
Day16 - Gin實做計算機 - Golang
下一篇
Day18 - Context - Golang
系列文
你知道Go是什麼嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
usnp2001
iT邦新手 4 級 ‧ 2023-08-25 09:34:07

請問一下,我把上面範例貼到 vscode 測試,發現import 自訂的 package 都會被消掉,導致報錯,後來我在別的編輯器做存檔,然後透過cmd 去run,它會找不到那個package 的位置,變成串接到 C:\Program Files\Go\src\sample-app\models 找不到,求解,謝謝

我要留言

立即登入留言