Gin(九):生成restful接口

NO IMAGE

不知不覺的已經更新到了第九篇,希望給讀者有所幫助吧。

原文首發於 ISLAND

經過前面幾章節的學習,基本對 Gin 中的一些概念和函數有所瞭解和掌握,也知道如何在代碼中對其進行使用,那麼接下來,我們將目光回到很久很久以前,具體多久呢?估摸著就是你在學習第二章 Gin 路由 的時候。

今天,不在模板上做文章了,而是要開啟新的章節,我們叫它 restful

📍restful 是什麼

說到 restful 相信很多乃至大量的朋友們都不陌生,如果你已經知道那就直接看下一個章節,但還是有很多小夥伴是第一次接觸,那麼這裡就簡單介紹一下restful

簡單的說 restful 就是一種 接口定義風格,比如說之前我們的接口對於更新用戶可能這樣定義, /update_user 對於獲取當前用戶可能是 get_user ,刪除當前用戶為 /delete_user ,而現在使用 restful 風格的接口,那麼我們對於更新用戶的接口定義為 /user,獲取用戶定義為 /user ,刪除用戶為 /user

???…………………………???

第一次接觸的朋友肯定是滿臉問號,所以我訪問一下 /user 數據是更新了?刪除了?還是獲取一個用戶?所以說一個完整的 restful 風格的接口並不是只是 url 的定義,還有請求方式。

還記得第二章中對於 gin 提供的 http 請求方式的說明嗎?所以一個完整的 restful 請求需要加上請求方式。對於更新用戶我們的接口應該是用 update 請求 “/user,對於獲取用戶應該用get請求方式/user,對於刪除用戶應該用delete請求/user` 接口。

這裡只對 restful 請求方式做最簡單的介紹。

🔖第一個接口

我們現在來進行一個關於文章接口的展示,仍舊是連接上數據庫,數據存在數據庫中。

首先建立數據庫,仍舊是在我們之前使用的數據庫上建立新的表 article ,下面為建表語句,並且連接數據庫。

create table ` article`
(
id int auto_increment
primary key,
type varchar(20) null,
content text not null
);

首先我們要有一個模型來和表結構對應,也用於我們接收前端的數據綁定。

新建 model 文件夾,在 model 文件夾中建立 article.go

type Article struct {
Id      int    `json:"id"`
Type    string `json:"type"`
Content string `json:"content"`
}

通過標註 json 來進行對前端數據獲取是的綁定。

接下來就可以完成第一個功能了,向數據庫新增一個 article 。在 article.go 中完成向數據添加數據的代碼,這裡代碼不做解釋,和之前一致。

func (article Article) Insert() int {
result, e := initDB.Db.Exec("insert into ` article` (type, content) values (?, ?);", article.Type, article.Content)
if e != nil {
log.Panicln("文章添加失敗", e.Error())
}
i, _ := result.LastInsertId()
return int(i)
}

完成 model 層,就可以完成 handler

handler 下新建 article/articleHandler.go

我們首要要獲取前端穿過來的數據。通過 context.ShouldBindJSON 來對數據進行綁定。如果綁定成功,則調用我們上面寫的增加方法進行添加。當完成後,通過 context.JSON 返回 json 數據。

func Insert(context *gin.Context) {
article := model.Article{}
var id = -1
if e := context.ShouldBindJSON(&article); e == nil {
id = article.Insert()
}
context.JSON(http.StatusOK, gin.H{
"id": id,
})
}

最後,我們完成對應的路由。

initRouter 中的 SetupRouter 中完善路由配置。

articleRouter := router.Group("")
{
// 添加一篇文章
articleRouter.POST("/article", article.Insert)
}

⭕測試

當這一切完成後就是運行測試了。

當然我們最好編寫單元測試。

test 文件夾中,新建 article_test.go 測試文件。

package test
import (
"GinHello/initRouter"
"GinHello/model"
"bytes"
"encoding/json"
"github.com/gin-gonic/gin"
"gopkg.in/go-playground/assert.v1"
"net/http"
"net/http/httptest"
"testing"
)
var router *gin.Engine
func init() {
router = initRouter.SetupRouter()
}
func TestInsertArticle(t *testing.T) {
article := model.Article{
Type:    "go",
Content: "hello gin",
}
marshal, _ := json.Marshal(article)
w := httptest.NewRecorder()
req := httptest.NewRequest(http.MethodPost, "/article", bytes.NewBufferString(string(marshal)))
req.Header.Add("content-typ", "application/json")
router.ServeHTTP(w, req)
assert.Equal(t, w.Code, http.StatusOK)
assert.NotEqual(t, "{id:-1}", w.Body.String())
}

在測試用例裡創建一個 article 對象,並且賦值,通過 json 方法建對象轉換為 json,最後發起請求。

運行測試用例,如果我們的代碼寫的 沒有問題的話,測試通過,並且數據庫中會對應添加該數據。

當然你不想寫單元測試也是可以的,可以通過 Postman 等來進行測試,這裡給大家簡單的介紹一下 GoLand Http 測試工具。

我們新建立一個 http_test 文件夾,在文件夾下面新建一個 .http 文件,命名為 article.http

Gin(九):生成restful接口

對文件進行編寫,編寫如下,指定我們的請求地址,指定要求的數據。在POST 左側就會出現一個 運行按鈕,點擊運行按鈕,控制檯會出現返回結果。運行該文件時,要將我們的項目啟動起來。

POST http://localhost:8080/article
Content-Type: application/json
{
"type": "go",
"content": "Hello Go"
}

其他的 .http 文件的語法規則 請看官方文檔

這樣就完成了第一個 restful 接口,同樣可以完成其他的接口。其他的接口示例請看 Github 上代碼。

✍總結

本章節主要講述瞭如何構建一套 restful 接口,restful 接口對於現在的開發是越來越重要了,大量的接口都是 restful 風格。Github 上代碼完成了查詢,添加,刪除等接口,篇幅有限,不展開多講了。

👩‍💻本章節示例代碼

Github

推薦閱讀

Gin(一):Hello
Gin(二):路由Router
Gin(三):模板tmpl
Gin(四):表單提交校驗和模型綁定
Gin(五):連接MySQL
Gin(六):文件的上傳
Gin(七):中間件的使用和定義
Gin(八):Cookie的使用
Gin(九):生成restful接口

個人公眾號

個人公眾號剛剛建立,希望大家給個關注,會更新 java,go, kotlin 等相關文章

Gin(九):生成restful接口

相關文章

詳談webpack4

RocketMQ源碼分析之路由中心(NameServer)

一文理解Netty模型架構

當Kotlin愛上React,會發生什麼反應