`
sillycat
  • 浏览: 2551984 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

2018 Golang Update(2)REST API with Gin

 
阅读更多
2018 Golang Update(2)REST API with Gin

Install Gin
>go get github.com/gin-gonic/gin

Install govendor
>go get github.com/kardianos/govendor
Add current path to go path
export GOPATH="/Users/carl/work/easy/easygo:/Users/carl/work/sillycat/monitor-water/restful_go_api"

Create the directory
>mkdir -p src/com/sillycat/restful_go_api

go to that working directory
>cd /Users/carl/work/sillycat/monitor-water/restful_go_api/src/com/sillycat/restful_go_api

I am using Mac Pro, install with brew
>brew install govendor
Check the version
>govendor --version
v1.0.9

Init the Project
>govendor init

Fetch gin
>govendor fetch github.com/gin-gonic/gin@v1.2

Copy the latest sample here
>curl https://raw.githubusercontent.com/gin-gonic/gin/master/examples/basic/main.go > main.go

Run the sample
>go run main.go

Build that like this
>go install com/sillycat/restful_go_api

Run it like this
>bin/restful_go_api
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env:export GIN_MODE=release
- using code:gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.setupRouter.func1 (3 handlers)
[GIN-debug] GET    /user/:name               --> main.setupRouter.func2 (3 handlers)
[GIN-debug] POST   /admin                    --> main.setupRouter.func3 (4 handlers)

I reactor the structure a little, code is in project monitor-water/restful_go_api

Read me is as follow:
#restful_go_api

Prepare the library
>go get github.com/gin-gonic/gin

How to Build
>go install sillycat.com/restful_go_api

How to Build for Linux
>env GOOS=linux GOARCH=amd64 go build -o bin/restful_go_api_linux -v sillycat.com/restful_go_api

How to Run
>bin/restful_go_api

How to Test
>go test sillycat.com/restful_go_api

restful_go_api/src/sillycat.com/main.go
package main

import "github.com/gin-gonic/gin"
import "sillycat.com/restful_go_api/waterrecord"

var DB = make(map[string]string)

func SetupRouter() *gin.Engine {
    // Disable Console Color
    // gin.DisableConsoleColor()
    router := gin.Default()

    // Ping test
    router.GET("/ping", func(c *gin.Context) {
        c.String(200, "pong")
    })

    v1 := router.Group("api/v1")
    {
        v1.GET("/waterrecords", waterrecord.GetWaterRecords)
        v1.GET("/waterrecords/:id", waterrecord.GetWaterRecord)
        v1.POST("/waterrecords", waterrecord.PostWaterRecord)
        v1.PUT("/waterrecords/:id", waterrecord.UpdateWaterRecord)
        v1.DELETE("/waterrecords/:id", waterrecord.DeleteWaterRecord)
    }

    return router
}

func main() {
    router := SetupRouter()
    // Listen and Server in 0.0.0.0:8080
    router.Run(":8080")
}

restful_go_api/src/sillycat.com/restful_go_api/waterrecord/waterrecord.go
package waterrecord

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

func GetWaterRecords(c *gin.Context) {
    c.JSON(200, gin.H{"ok": "GET api/v1/waterrecords"})
}

func GetWaterRecord(c *gin.Context) {
    c.JSON(200, gin.H{"ok": "GET api/v1/waterrecords/1"})
}

func PostWaterRecord(c *gin.Context) {
    c.JSON(200, gin.H{"ok": "POST api/v1/waterrecords"})

}

func UpdateWaterRecord(c *gin.Context) {
    c.JSON(200, gin.H{"ok": "PUT api/v1/waterrecords/1"})

}

func DeleteWaterRecord(c *gin.Context) {
    c.JSON(200, gin.H{"ok": "DELETE api/v1/waterrecords/1"})
}

restful_go_api/src/sillycat.com/restful_go_api/main_test.go
package main

import (
    "bytes"
    "github.com/gin-gonic/gin"
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestGetInstruction(t *testing.T) {
    gin.SetMode(gin.TestMode)
    testRouter := SetupRouter()

    req, err := http.NewRequest("GET", "/api/v1/waterrecords/1", nil)
    if err != nil {
        t.Errorf("Get hearteat failed with error %d.", err)
    }

    resp := httptest.NewRecorder()
    testRouter.ServeHTTP(resp, req)

    if resp.Code != 200 {
        t.Errorf("/api/v1/waterrecords failed with error code %d.", resp.Code)
    }
}

func TestGetInstructions(t *testing.T) {
    gin.SetMode(gin.TestMode)
    testRouter := SetupRouter()

    req, err := http.NewRequest("GET", "/api/v1/waterrecords", nil)
    if err != nil {
        t.Errorf("Get hearteat failed with error %d.", err)
    }

    resp := httptest.NewRecorder()
    testRouter.ServeHTTP(resp, req)

    if resp.Code != 200 {
        t.Errorf("/api/v1/waterrecords failed with error code %d.", resp.Code)
    }
}

func TestPostInstruction(t *testing.T) {
    gin.SetMode(gin.TestMode)
    testRouter := SetupRouter()

    body := bytes.NewBuffer([]byte("{\"event_status\": \"83\", \"event_name\": \"100\"}"))

    req, err := http.NewRequest("POST", "/api/v1/waterrecords", body)
    req.Header.Set("Content-Type", "application/json")
    if err != nil {
        t.Errorf("Post hearteat failed with error %d.", err)
    }

    resp := httptest.NewRecorder()
    testRouter.ServeHTTP(resp, req)

    if resp.Code != 201 {
        t.Errorf("/api/v1/waterrecords failed with error code %d.", resp.Code)
    }
}

func TestPutInstruction(t *testing.T) {
    gin.SetMode(gin.TestMode)
    testRouter := SetupRouter()

    body := bytes.NewBuffer([]byte("{\"event_status\": \"83\", \"event_name\": \"100\"}"))

    req, err := http.NewRequest("PUT", "/api/v1/waterrecords/1", body)
    req.Header.Set("Content-Type", "application/json")
    if err != nil {
        t.Errorf("Put hearteat failed with error %d.", err)
    }

    resp := httptest.NewRecorder()
    testRouter.ServeHTTP(resp, req)

    if resp.Code != 200 {
        t.Errorf("/api/v1/waterrecords failed with error code %d.", resp.Code)
    }
}



Database Layer
https://github.com/go-gorp/gorp
http://hao.jobbole.com/gorp/
https://awesome-go.com/#orm
https://github.com/go-xorm/xorm
http://xorm.io/

I will check and use xorm to see if it works.

References:
https://github.com/gin-gonic/gin
https://github.com/avelino/awesome-go#web-frameworks
https://github.com/kardianos/govendor
http://himarsh.org/build-restful-api-microservice-with-go/
https://github.com/marshallshen/instructions

https://coolshell.cn/articles/8460.html
https://coolshell.cn/articles/8489.html
https://stackoverflow.com/questions/30885098/go-local-import-in-non-local-package

分享到:
评论

相关推荐

    Golang Gin RESTFul API with SQLite

    【Golang Gin RESTFul API with SQLite】是一个项目,它教你如何使用Go语言的Gin框架来构建符合RESTful架构的API,并结合SQLite数据库进行数据存储。在这个项目中,我们将探讨Gin框架的核心特性,RESTful API设计...

    使用 Golang 和 Gin 开发 RESTful API.pdf

    golang——使用 Golang 和 Gin 开发 RESTful API

    camunda-client-go:用于golang的Camunda REST API客户端

    用于golang的Camunda REST API客户端安装 go get github.com/citilinkru/camunda-client-go/v2用法创建客户端: client := camunda_client_go . NewClient (camunda_client_go. ClientOptions {EndpointUrl : ...

    Golang-Gin框架示例二十多个源码

    这将极大地提升你在Golang Web开发中的技能和效率,无论是创建RESTful API、构建Web应用还是搭建后台服务,Gin都是一个值得信赖的工具。在实践中不断探索这些源码,你将更好地掌握Gin框架的精髓。

    Golang api 最新官方中文手册

    Golang中文API,由热心网友翻译上传

    golang_starter:用golang编写的REST API入门套件

    Golang REST API入门 此入门工具供您选择并根据需要进行修改。 这个项目促进思想上的代码。 并且,如果有任何零件的设计模式不正确,希望您通过提出一个问题来提供反馈。 这是什么? 这个想法是使所有项目(包括...

    golang-rest-api:示例Golang Rest API

    Golang-Rest-API 示例Golang Rest API 命令 # Start server make run # Start server for local make run-local # Stop server make stop

    go-wordpress, Golang API的客户端库( Wordpress REST API ).zip

    go-wordpress, Golang API的客户端库( Wordpress REST API ) go-wp-apiGolang api的客户端库( Wordpress REST API )安装go get github.com/sogko/go-wordpress用法快速示例package main

    Golang中文API.rar

    《Golang中文API详解》 在编程领域,API(Application Programming Interface)是开发者与软件库、框架或操作系统交互的关键工具。对于Go语言,一个由Google开发的高效、简洁且并发性能出色的编程语言,其官方提供...

    Gin+Gorm开发Golang API快速开发脚手架-Golang开发

    Gin+Gorm开发Golang API快速开发脚手架 Singo Singo: Simple Single Golang Web Service go-crud正式改名为Singo! 使用Singo开发Web服务: 用最简单的架构,实现够用的框架,服务海量用户 ... Singo文档 ...

    golang-stats-api-handler, Golang cpu,内存,gc等信息api处理程序.zip

    golang-stats-api-handler, Golang cpu,内存,gc等信息api处理程序 golang-stats-api-handlerGolang cpu,内存,gc等信息api处理程序。 安装go get github.com/fukata/golang-stats-api-handler示

    golang(gin)整合mysql,整合redis通用脚手架

    4. **路由设计**:根据REST原则设计API路由,如GET /users, POST /users, PUT /users/:id等。 5. **测试**:编写单元测试和集成测试,确保每个功能的正确性。 6. **日志记录**:使用如`logrus`或`zap`库进行日志...

    由gin + gorm + jwt + casbin组合实现的RBAC权限管理脚手架Golang-gin-web.zip

    在本文中,我们将深入探讨如何使用Gin、Gorm、JWT和Casbin这四个关键组件构建一个基于Golang的RBAC(Role-Based Access Control)权限管理系统。Gin是一个高效的Web框架,Gorm是一个用于Go语言的ORM库,JWT(Json ...

    golang-rest-api-mysql:使用Golang和MySQL构建的简单Rest Api

    在本文中,我们将深入探讨如何使用Golang和MySQL构建一个简单的REST API。Golang,也称为Go语言,是由Google开发的一种静态类型、编译型、并发型、垃圾回收的编程语言,特别适合于构建高性能的网络服务。而MySQL是...

    Go-Clean-Architecture-REST-API:Golang Clean Architecture REST API示例

    Golang REST API示例 :rocket: :man::laptop: 完整列出已使用的内容: -Web框架数据库/ sql的扩展。 -Go的PostgreSQL驱动程序和工具包使用fangs进行配置 -Golang的类型安全Redis客户端记录器-结构和现场验证 -JSON ...

    Go-httpexpect-golang的端到端HTTP和RESTAPI

    本文将深入探讨"Go-httpexpect-golang的端到端HTTP和REST API"这一主题,介绍如何利用httpexpect库进行高效的测试。 httpexpect是Go语言中一个强大的工具,专为编写端到端HTTP和REST API测试而设计。它提供了简洁、...

    Zeus基于Golang Gin +casbin,致力于做企业统一权限&账号中心管理系统.zip

    2. **Gin框架**:Gin是Golang的一个Web开发框架,它使用MVC(模型-视图-控制器)模式,提供了一套快速开发API和Web应用的结构。Gin依赖于martini中间件库,通过简洁的语法和高效性能,使开发者能够快速构建强大的Web...

    rocketapi:用golang编写的Rocketchat Rest API客户端

    RocketAPI是用Golang语言开发的一个针对Rocketchat平台的REST API客户端库。Rocketchat是一款流行的开源聊天和协作工具,提供了丰富的API接口供开发者进行集成和扩展。使用RocketAPI,开发者可以方便地在Go应用中与...

    golang_gin_restful_api.pdf

    本文档介绍了一本名为《golang_gin_restful_api.pdf》的小册子,该小册详细介绍了使用Go语言和Gin框架构建RESTful API服务的过程。Gin是一个高性能的Go(golang)语言编写的Web框架,专门用于API服务的构建,它提供...

    huma:用于带有OpenAPI 3的Golang的Huma REST API框架

    用于Go的现代,简单,快速且自以为是的REST API框架,包括电池。 发音为IPA: 。 该项目的目标是提供: 适用于Go开发人员的现代REST API后端框架由和描述对中间件,JSON / CBOR和其他功能的一流支持护栏防止常见错误...

Global site tag (gtag.js) - Google Analytics