如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)
介绍
Go 语言最近十分火热,但对于新手来说,想立马上手全新的语法和各种各样的框架还是有点难度的。即使是基础学习也很有挺有挑战性。
在这篇文章中,我想用最少的代码写出一个可用的 API 服务。这个 API 可以提供增删改查(CRUD)这些基本功能,对象关系映射 (ORM) 让数据库操作变得非常简单,不用 100 行代码,都可以搞定。让我们开始吧。
在下面这个连接中可以找到最后完成的全部代码:
https://github.com/cgrant/gin-gorm-api-example
起步
这篇文章假设读者已经安装了 Go 的运行环境,如果您还没装好 Go,可以移步到这篇文章,参考一下:
http://cgrant.io/tutorials/go/getting-started-with-go/
Gin
既然是搭建 API 服务,就需要一个 Web 框架来处理路由并响应 HTTP 请求,Go 语言有很多各式各样的开源框架,本文我们选用了 Gin https://github.com/gin-gonic/gin。Gin 的特点是响应速度快,结构简单。
我们先来给 API 服务创建文件夹和 main.go 文件吧。
$ mkdir -p $GOPATH/src/simple-api
$ cd $GOPATH/src/simple-api
$ touch main.go
代码如下
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
我们先测试一下。
$ go run main.go
Hello World
非常好,现在让我们把 Gin 框架的代码加进去。
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello World")
})
r.Run()
}
保存并运行。
$ go run main.go
[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 / → main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2016/12/02–14:57:52 | 200 | 33.798µs | ::1 | GET /
在浏览器中访问地址 http://localhost:8080
Hello World
成功了!!!
不过我们是在写 API,没人会返回字符串的,把返回值改成 JSON 格式吧。
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello World")
c.JSON(200, gin.H{
"message": "Hello World",
})
})
r.Run()
}
保存文件,重新运行 API server,刷新浏览器,返回值变成了 JSON。
{“message”: “Hello World”}
用 GORM 把数据持久化
现在让我们考虑一下服务的持久化层,在这部分中,我们将把数据保存在一个本地 SQLite 文件中,在稍后的章节中,我们将改为 MySQL。
Gorm http://jinzhu.me/gorm/ 是一个 Go 语言实现的对象关系映射 (ORM) 框架。它简化了程序对数据库的操作,虽然我不是很赞同在大型的复杂系统中使用 ORM,但 ORM 在小项目中做做原型验证还是很不错的。Gorm 是 Go 的生态中很流行的工具,所以我们先从这里入手吧。
我们从头开始,先把之前的代码去掉,在浏览了 GORM 的主要功能后,再把 Gin 的代码加回来。先来个简单的例子:
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
func main() {
db, _ := gorm.Open("sqlite3", "./gorm.db")
defer db.Close()
}
执行程序后,在运行环境的文件系统里可以看到一个新文件 gorm.db
。这就是 API 的数据库文件了。我们的 API 程序现在还没什么功能,让我们再加点代码吧。
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
type Person struct {
ID uint `json:"id"`
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
}
func main() {
db, _ := gorm.Open("sqlite3", "./gorm.db")
defer db.Close()
p1 := Person{FirstName: "John", LastName: "Doe"}
p2 := Person{FirstName: "Jane", LastName: "Smith"}
fmt.Println(p1.FirstName)
fmt.Println(p2.LastName)
}
我们刚刚加了一个叫 Person 的结构体,然后建了几个 Person 类型的实例,并打印了里面的值。请注意结构体 Person 里的每个域的名字必须是大写字母开头的,这样 Go 语言才认为这是一个共有域。
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
type Person struct {
ID uint `json:"id"`
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
}
func main() {
db, _ := gorm.Open("sqlite3", "./gorm.db")
defer db.Close()
db.AutoMigrate(&Person{})
p1 := Person{FirstName: "John", LastName: "Doe"}
p2 := Person{FirstName: "Jane", LastName: "Smith"}
db.Create(&p1)
var p3 Person
db.First(&p3)
fmt.Println(p1.FirstName)
fmt.Println(p2.LastName)
fmt.Println(p3.LastName)
}
到目前为止都很顺利,执行一下程序看看能得到什么结果。
$ go run main.go
John
Smith
Doe
写起来还是挺简单的吧,不用几行代码,我们就可以从数据库中存取信息了。Gorm 还有很多其他特性,接下来让我们再试试其中比较重要的功能,当然,要了解更多信息的话,请查看 Gorm 的文档。
作者:blackpiglet
链接:https://www.jianshu.com/p/35665b584347
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)的更多相关文章
- 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)
修改数据结构 基本的 API 已经定义好了,现在是个修改 Person 对象结构的好时机.只要修改 Person 结构体,数据库和 API 都会自动做出相应的修改. 我要做的是在 Person ...
- 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (二)
创建 API 我们之前已经跑过 Gin 框架的代码,现在是时候加些功能进去了. 读取全部信息 我们先从"增删改查"中的"查"入手,查询我们之前添加的信息.我接下来要删除几行代码,并把 Gin ...
- 超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务
来自:JavaGuide Github 地址:https://github.com/Snailclimb/springboot-integration-examples 目录: 使用 SpringBo ...
- 使用 SpringBoot+Dubbo 搭建一个简单分布式服务
实战之前,先来看几个重要的概念 开始实战之前,我们先来简单的了解一下这样几个概念:Dubbo.RPC.分布式.由于本文的目的是带大家使用SpringBoot+Dubbo 搭建一个简单的分布式服务,所以 ...
- 用nodejs搭建一个简单的服务器
使用nodejs搭建一个简单的服务器 nodejs优点:性能高(读写文件) 数据操作能力强 官网:www.nodejs.org 验证是否安装成功:cmd命令行中输入node -v 如果显示版本号表示安 ...
- 初学Node(六)搭建一个简单的服务器
搭建一个简单的服务器 通过下面的代码可以搭建一个简单的服务器: var http = require("http"); http.createServer(function(req ...
- 【netty】(2)---搭建一个简单服务器
netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...
- 使用gitblit搭建一个简单的局域网服务器
使用gitblit搭建一个简单的局域网服务器 1.使用背景 现在很多使用github管理代码,但是github需要互联网的支持,而且私有的git库需要收费.有一些项目的代码不能外泄,所以,搭建一个局域 ...
- Golang学习-第二篇 搭建一个简单的Go Web服务器
序言 由于本人一直从事Web服务器端的程序开发,所以在学习Golang也想从Web这里开始学起,如果对Golang还不太清楚怎么搭建环境的朋友们可以参考我的上一篇文章 Golang的简单介绍及Wind ...
随机推荐
- virtualbox之紧虚拟主机与本地主机连接
也就是手工配置IP地址.子网掩码.网关和DNS. 设置方法如下: vi /etc/sysconfig/network-scripts/ifcfg-eth0 编辑本地网卡的配置文件 主要查看下面这几项是 ...
- [程序员代码面试指南]字符串问题-回文最少分割数(DP)
问题描述 给定一个字符串,输出把它全部切成回文子串的最小分割数. 例:str="ACDCDCDAD",输出2. 解题思路 DP 存储结构 dp数组dp[len+1],dp[i]表示 ...
- 痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加C++源文件进SDK工程编译的方法. 最近有客户反映在MCUXpresso IDE下的SDK工程里添加 ...
- redis.conf讲解
转自https://www.cnblogs.com/zhang-ke/p/5981108.html #redis.conf # Redis configuration file example. # ...
- hystrix熔断器之HystrixRequestLog
HystrixRequestLog会记录所有执行过的命令.
- C# NX二次开发环境搭建
在网上看到一篇C#二次开发环境搭建的文章:NX二次开发-使用NXOPEN C#手工搭建开发环境配置 ,写得非常好.我按照文章操作,过程中遇到几个问题,把问题分享给大家,希望对各位有帮助. 注意三点: ...
- 我给VSCode报了个bug,微软工程师竟然凌晨回复了...
柠檬哥整理了50本计算机相关的电子书,关注公众号「后端技术学堂」,回复「1024」即可获取,回复「进群」拉你进读者技术交流群. 本文首发个人微信公众号,欢迎围观点击阅读原文 最近遇到一个有意思的bug ...
- Android小部件Widget开发过程中的坑和总结
@ 目录 概述 官方参考 效果图 AndroidManifest.xml Receiver Service Options res/xml/ widget_desktop_options.xml 常用 ...
- (数据科学学习手札96)在geopandas中叠加在线地图
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 国庆期间,抽空给大家分享在geopandas中叠 ...
- 01 百度 AI Studio 基础操作记录(一) Notebook
转载参考: AI Studio基本操作(一) Notebook篇 一.基础 1.新建文件: 可以使用命令, !cat <<newfile > newfile.py 在项目空间内直接创 ...