golang rest api example

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

func Database() *gorm.DB {
    //open a db connection
    db, err := gorm.Open("mysql", "root:[email protected](127.0.0.1:8889)/gotest?parseTime=true")
    if err != nil {
        panic("failed to connect database")
    }
    return db
}

func main() {

    //Migrate the schema
    db := Database()
    db.AutoMigrate(&Product{})
    router := gin.Default()
    router.GET("/", startPage)
    router.LoadHTMLGlob("templates/*")
    v1 := router.Group("/api/v1/")
    {
        v1.POST("product/", CreateProduct)
        v1.GET("product/", FetchAllProduct)
        v1.GET("product/:id", FetchSingleProduct)
        v1.PUT("product/:id", UpdateProduct)
        v1.DELETE("product/:id", DeleteProduct)
    }
    router.Run()

}

type Product struct {
    gorm.Model
    Name        string `json:"name"`
    Description string `json:"description"`
    Images      string `json:"images"`
    Price       string `json:"price"`
}

type TransformedProduct struct {
    ID          uint   `json:"id"`
    Name        string `json:"name"`
    Description string `json:"description"`
    Images      string `json:"images"`
    Price       string `json:"price"`
}

func CreateProduct(c *gin.Context) {

    product := Product{
        Name:        c.PostForm("name"),
        Description: c.PostForm("description"),
        Images:      c.PostForm("images"),
        Price:       c.PostForm("price"),
    }
    db := Database()
    db.Save(&product)
    c.JSON(http.StatusCreated, gin.H{"status": http.StatusCreated, "message": "Product item created successfully!", "resourceId": product.ID})
}

func FetchAllProduct(c *gin.Context) {
    var products []Product
    var _products []TransformedProduct

    db := Database()
    db.Find(&products)

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

    //transforms the todos for building a good response
    for _, item := range products {
        _products = append(
            _products, TransformedProduct{
                ID:          item.ID,
                Name:        item.Name,
                Description: item.Description,
                Images:      item.Images,
                Price:       item.Price,
            })
    }
    c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": _products})
}

func FetchSingleProduct(c *gin.Context) {
    var product Product
    productId := c.Param("id")

    db := Database()
    db.First(&product, productId)

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

    _product := TransformedProduct{
        ID:          product.ID,
        Name:        product.Name,
        Description: product.Description,
        Images:      product.Images,
        Price:       product.Price,
    }
    c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": _product})
}

func UpdateProduct(c *gin.Context) {
    var product Product
    tproductId := c.Param("id")
    db := Database()
    db.First(&product, tproductId)

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

    db.Model(&product).Update("name", c.PostForm("name"))
    db.Model(&product).Update("descroption", c.PostForm("descroption"))
    db.Model(&product).Update("images", c.PostForm("images"))
    db.Model(&product).Update("price", c.PostForm("price"))
    c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "message": "Product updated successfully!"})
}

func DeleteProduct(c *gin.Context) {
    var product Product
    productId := c.Param("id")
    db := Database()
    db.First(&product, productId)

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

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

func startPage(c *gin.Context) {
    c.HTML(http.StatusOK, "index.tmpl", gin.H{
        "title": "simple api gin",
    })
}

原文地址:https://www.cnblogs.com/liujitao79/p/9674694.html

时间: 2024-08-30 03:02:59

golang rest api example的相关文章

golang esl api

通过ESL 调取FS的状态,比如show calls : 用golang  eventsocket 实现 conn, err := eventsocket.Dial("192.168.5.32:8021","ClueCon") if err != nil { this.emitError(so, 413) return "" } ev, _ := conn.Send(fmt.Sprintf("api show calls"))

golang原生api实现get和post

服务端 在golang中,实现一个普通的http接口可以处理get请求和x-www-form-urlencoded类型的post请求,而如果想实现处理json数据的post请求,则需要用另外的方式实现,接收的参数要从request.Body中读取: getpost.go package main import ( "net/http" "encoding/json" "log" ) func main() { http.HandleFunc(&q

Golang Gateway API 搭建教程

原文链接 随着微服务的兴起,行业里出现了非常多优秀的微服务网关框架,今天教大家搭建一套国人,用Golang写的微服务网关框架. 这里啰嗦一句,可能到今天还有人不理解什么是微服务,为什么要用微服务.目前网上相对比较模糊,没有精确的定义,但大家的意思都差不多,这里个人通俗描述,就是小项目发展到大项目过程中,出于已维护,与稳定性等考虑,将一个整体项目分为多个微小服务. 微服务网关的作用是在用户第一个网关服务器,你按照业务服务相关需求,给网关分流,相比云主机厂商提供的负载均衡器,强大在于你可以根据自己业

golang 获取api 数据

直接上代码 type ApiRequest interface{} //参数 e 一个空接口,f http请求连接, p 请求方式 参数为 "POST" 或 "GET" func FromApiGetData(e *ApiRequest, f *PostUrl, p string) (string, error) { jsons, errs := json.Marshal(e) if errs != nil { fmt.Println(errs.Error()) }

golang gin框架 使用swagger生成api文档

github地址:https://github.com/swaggo/gin-swagger 1.下载swag $ go get -u github.com/swaggo/swag/cmd/swag 2.在main.go所在目录执行 $ swag init 生成docs/doc.go以及docs/swagger.json,docs/swagger.yaml 3.下载gin-swagger $ go get -u github.com/swaggo/gin-swagger $ go get -u

CentOS环境利用mariadb(mysql)数据库使用golang实现分布式系统的Leader选举

一.准备工作 1.下载安装vmware,步骤省略. 2.下载CentOS系统ios包:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1611.iso 3.下载安装Xshell5,步骤省略. 4.下载安装git,步骤省略. 5.mariadb用于golang的api:https://github.com/go-sql-driver/mysql 6.vmware中依次点击"创建新的虚拟机&q

golang包快速生成base64验证码

base64Captcha快速生成base64编码图片验证码字符串 支持多种样式,算术,数字,字母,混合模式,语音模式. Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一.Base64编码可用于在HTTP环境下传递较长的标识信息, 直接把base64当成是字符串方式的数据就好了 减少了http请求:数据就是图片: 为APIs微服务而设计 为什么base64图片 for RESTful 服务 Data URIs 支持大部分浏览器,IE8之后也支持. 小图片使用base64响应对于

golang web 方案

概要 开发 web 框架 数据库 认证 日志 配置 静态文件服务 上传/下载 发布 docker 打包 部署中遇到的问题 时区问题 概要 轻量的基于 golang 的 web 开发实践. golang 上手简单, 第三方库丰富, 对于业务没那么复杂的项目, 作为 API 的后端也是不错的选择. 下面是对 golang 作为 API 后端的 web 开发实践总结. 开发 API 后端的功能模块基本已经固定, 基于自己的项目, 主要使用了以下模块: web 框架: 整个方案的核心 数据库: orm

开源API网关,你选对了么?

开源API网关,你选对了么? api网关的本质 不用扯那么多,也不用画图,一句话说清楚 api网关:流量总入口,得以集中控制! 就这么简单 api网关协议上最基本要支持HTTP 和 WebSocket,功能强大点的更会支持tcp/udp的负载均衡接入 正因为支持的是http协议,所以api网关不仅仅可以作为 RESTful API 接入,接入带页面的web都可以的,完全可以当成一个web负载均衡器使用 api网关的作用 解决:认证.鉴权.安全.流量管控.缓存.服务路由,协议转换.服务编排.熔断.