Build RESTful API service using Gin Web Framework

安裝依賴
$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/jinzhu/gorm
$ go get github.com/go-sql-driver/mysql
路由規(guī)劃
POST todos/
GET todos/
GET todos/{id}
PUT todos/{id}
DELETE todos/{id}
完整源碼
package main

import (
    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "net/http"
    "strconv"
)

type (
    Todo struct {
        gorm.Model
        Title     string `json:"title"`
        Completed int    `json:"completed"`
    }

    transformedTodo struct {
        ID        uint   `json:"id"`
        Title     string `json:"title"`
        Completed bool   `json:"completed"`
    }
)

var db *gorm.DB

func init() {
    var err error
    db, err = gorm.Open("mysql", "root:123456@/demo?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic("failed to connect database")
    }
    // 自動遷移
    db.AutoMigrate(&Todo{})
}

func createTodo(c *gin.Context) {
    completed, _ := strconv.Atoi(c.PostForm("completed"))
    todo := Todo{
        Title:     c.PostForm("title"),
        Completed: completed,
    }
    db.Save(&todo)
    c.JSON(http.StatusCreated, gin.H{"status": http.StatusCreated, "message": "Todo item created successfully!", "id": todo.ID})

}

func fetchAllTodo(c *gin.Context) {
    var todos []Todo
    var _todos []transformedTodo
    db.Find(&todos)
    if len(todos) <= 0 {
        c.JSON(http.StatusNotFound, gin.H{"status": http.StatusNotFound, "message": "No todo found!"})
        return
    }
    for _, todo := range todos {
        completed := false
        if todo.Completed == 1 {
            completed = true
        } else {
            completed = false
        }

        _todos = append(_todos, transformedTodo{
            ID:        todo.ID,
            Title:     todo.Title,
            Completed: completed,
        })
    }
    c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": _todos})
}

func fetchSingleTodo(c *gin.Context) {
    var todo Todo
    id := c.Param("id")
    db.First(&todo, id)
    if todo.ID == 0 {
        c.JSON(http.StatusNotFound, gin.H{"status": http.StatusNotFound, "message": "No todo found!"})
        return
    }

    completed := false
    if todo.Completed == 1 {
        completed = true
    } else {
        completed = false
    }
    _todo := transformedTodo{
        ID:        todo.ID,
        Title:     todo.Title,
        Completed: completed,
    }
    c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": _todo})
}

func deleteTodo(c *gin.Context) {
    var todo Todo
    id := c.Param("id")

    db.First(&todo, id)

    if todo.ID == 0 {
        c.JSON(http.StatusNotFound, gin.H{"status": http.StatusNotFound, "message": "No todo found!"})
        return
    }

    db.Delete(&todo)
    c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "message": "Todo deleted successfully!"})
}

func updateTodo(c *gin.Context) {
    var todo Todo
    id := c.Param("id")

    db.First(&todo, id)

    if todo.ID == 0 {
        c.JSON(http.StatusNotFound, gin.H{"status": http.StatusNotFound, "message": "No todo found!"})
        return
    }

    completed, _ := strconv.Atoi(c.PostForm("completed"))
    db.Model(&todo).Updates(Todo{Title: c.PostForm("title"), Completed: completed})
    c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "message": "Todo updated successfully!"})
}

func main() {
    defer db.Close()
    router := gin.Default()
    v1 := router.Group("/api/v1/todos")
    {
        v1.POST("/", createTodo)
        v1.GET("/", fetchAllTodo)
        v1.GET("/:id", fetchSingleTodo)
        v1.PUT("/:id", updateTodo)
        v1.DELETE("/:id", deleteTodo)
    }
    router.Run()
}

參考鏈接:https://medium.com/@thedevsaddam/build-restful-api-service-in-golang-using-gin-gonic-framework-85b1a6e176f3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末够挂,一起剝皮案震驚了整個濱河市玛痊,隨后出現(xiàn)的幾起案子炭臭,更是在濱河造成了極大的恐慌负蚊,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墨缘,死亡現(xiàn)場離奇詭異星虹,居然都是意外死亡零抬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門宽涌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來平夜,“玉大人,你說我怎么就攤上這事卸亮『龆剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵兼贸,是天一觀的道長段直。 經(jīng)常有香客問我,道長溶诞,這世上最難降的妖魔是什么鸯檬? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮螺垢,結(jié)果婚禮上喧务,老公的妹妹穿的比我還像新娘。我一直安慰自己枉圃,他們只是感情好功茴,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孽亲,像睡著了一般坎穿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上返劲,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天玲昧,我揣著相機與錄音,去河邊找鬼篮绿。 笑死酌呆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的搔耕。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼痰娱,長吁一口氣:“原來是場噩夢啊……” “哼弃榨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梨睁,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤鲸睛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坡贺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體官辈,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡箱舞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拳亿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晴股。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肺魁,靈堂內(nèi)的尸體忽然破棺而出电湘,到底是詐尸還是另有隱情,我是刑警寧澤鹅经,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布寂呛,位于F島的核電站,受9級特大地震影響瘾晃,放射性物質(zhì)發(fā)生泄漏贷痪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一蹦误、第九天 我趴在偏房一處隱蔽的房頂上張望劫拢。 院中可真熱鬧,春花似錦胖缤、人聲如沸尚镰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狗唉。三九已至,卻和暖如春涡真,著一層夾襖步出監(jiān)牢的瞬間分俯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工哆料, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缸剪,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓东亦,卻偏偏與公主長得像杏节,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子典阵,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,321評論 25 707
  • 用兩張圖告訴你奋渔,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,753評論 2 59
  • 最后一天假期 拖著疲憊的身體 洗了個澡澡 準備開始做作業(yè) 作為每周的常規(guī) 周一上午十一點依舊是HM十二點是LA壮啊。一...
    烏冬面國的金色小新閱讀 177評論 0 0
  • 親子日記第120天 天氣:晴 星期日 今天是周日嫉鲸,本周的最后一天, Because I was at ...
    尤克吉他閱讀 213評論 0 0
  • 00:20 熱 掀掉了被子 膝蓋疼 胃受涼 肩膀酸 我只得選擇妥協(xié)歹啼。 18歲的女孩啊 心里有事哩 想起了愛吃的酸菜...
    旋音閱讀 271評論 0 1