今天就來介紹一下API
好了,身為準工程師的我也是第一次碰到API相關的概念,就用我理解到的方式來寫今天的內容囉。
開始主題吧!!
Application Programming Interface,中文翻譯是應用程式介面,目的是為了讓資料可以在不同平台間交換,一端提供資料輸入、另一端依據資料回傳結果,這就是典型的API
範例。通常用在網站後端與前端交換資料用。
白話解說:看到很多例子都是用餐廳做舉例,顧客與廚房透過服務生這個API
做資訊交換,顧客想要餐點時拜託服務員(API)
來點餐,廚房送餐時由服務員(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
是API
最常使用的資料格式,以純文字為基底去儲存和傳送簡單結構資料,也可以透過物件或陣列來傳送較複雜的資料,可以簡單的與其他程式溝通、交換資料。
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
觀看已存放的使用者資料、新增資料、刪除資料,沒有使用SQL
因此使用Go model
的方式撰寫。
前面都是把大部份資料寫在main
內,程式碼很亂又很難維護,這邊上網參考了一下其他前輩的API
結構。
├──sample-app
│ ├── apis
│ │ └── apiuser.go
│ ├── models
│ │ └── user.go
│ └── router
│ └── router.go
└──main.go
api
: 存放各種API功能models
: 存放各種model
,本例的話是User
router
: 路由綁定API
的程式碼創建一個全域變數Userlist
模擬SQL
存放資料,並有Insert
、Delete
對Userlist
操作。
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)
}
沒什麼特別的,就是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!",
})
}
綁定路由與功能,以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
內相當簡潔ˊˇˋ
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
請問一下,我把上面範例貼到 vscode 測試,發現import 自訂的 package 都會被消掉,導致報錯,後來我在別的編輯器做存檔,然後透過cmd 去run,它會找不到那個package 的位置,變成串接到 C:\Program Files\Go\src\sample-app\models 找不到,求解,謝謝