安装使用
Gin 是一个 golang 的微框架,封装比较优雅,API 友好,源代码比较明确。具有快速灵活,容错方便等特点。其实对于 golang 而言,web 框架的依赖远比 python,java 之类的要小。自身的 net/http 足够简单,性能也非常不错。框架更像是一个常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。
Gin 官方文档地址:https://gin-gonic.com/zh-cn.docs
安装 Gin:
go get -u github.com/gin-gonic/gin
在 windows 10 系统中,安装 Go1.19 之后的版本,然后打开 go module,在命令行终端中输入:go env -w GO111MODULE=on
修改指定的代理,在命令行终端中输入:go env -w GOPROXY=https:/lgoproxy.io,direct
package main
import "github.com/gin-gonic/gin"
import "github.com/thinkerou/favicon"
func main ( ) {
ginServer := gin. Default ( )
ginServer. Use ( favicon. New ( "path/to/your/icon" ) )
ginServer. GET ( "/hello" , func ( context * gin. Context) {
context. JSON ( 200 , gin. H{ "msg" : "Hello World!" } )
} )
ginServer. Run ( ":8082" )
}
RESTful API
RESTful API(Representational State Transfer API)是一种基于REST架构风格的网络应用编程接口,它通过HTTP协议进行通信,常用于Web服务的实现。RESTful API遵循一些基本的设计原则,使得服务更加灵活、简单和易于维护。
REST的核心思想是通过定义资源(Resource)并通过HTTP动词(GET、POST、PUT、DELETE等)对资源进行操作。
get / user
post / create_user
post / update_user
post / delete_user
get / user
post / user
put / user
delete / user
GET:获取资源,不修改服务器上的数据。
POST:创建新的资源,通常用于提交数据。
PUT:更新资源,用于替代现有资源。
DELETE:删除资源。
PATCH:部分更新资源。
ginServer. GET ( "/hello" , func ( context * gin. Context) {
context. JSON ( 200 , gin. H{ "msg" : "Hello World!" } )
} )
ginServer. POST ( "/user" , func ( context * gin. Context) {
context. JSON ( 200 , gin. H{ "msg" : "Post user" } )
} )
ginServer. PUT ( "/user" , func ( context * gin. Context) {
context. JSON ( 200 , gin. H{ "msg" : "Put user" } )
} )
ginServer. DELETE ( "/user" , func ( context * gin. Context) {
context. JSON ( 200 , gin. H{ "msg" : "Delete user" } )
} )
响应页面
ginServer. loadHTMLGlob ( "templates/*" )
gin. Server. Static ( "./static" , "./static" )
ginServer. GET ( "/index" , func ( context * gin. Context) {
context. HTML ( http. StatusOK, "index.html" , gin. H{
"msg" : "This is the data form server."
} )
} )
获取请求参数
url?userid=1&username=z3
,url传参方式
ginServer. GET ( "/user/info" , func ( context * gin. Context) {
userid := context. Query ( "userid" )
username := context. Query ( "username" )
context. JSON ( http. StatusOK, gin. H {
"userid" : userid,
"username" : username,
} )
} )
url/user/info/1/z3
,RestFul风格请求参数
ginServer. GET ( "/user/info/:userid/:username" , func ( context * gin. Context) {
userid := context. Param ( "userid" )
username := context. Param ( "username" )
context. JSON ( http. StatusOK, gin. H {
"userid" : userid,
"username" : username,
} )
} )
ginServer. GET ( "/json" , func ( context * gin. Context) {
b, _ := context. GetRawData ( )
var m map [ string ] interface { }
_ = json. Unmarshal ( b, & m)
context. JSON ( http. StatusOK, m)
} )
ginServer. GET ( "/user/add" , func ( context * gin. Context) {
username := context. PostForm ( "username" )
password := context. PostForm ( "password" )
context. JSON ( http. StatusOK, gin. H {
"msg" : "ok" ,
"username" : username,
"password" : password,
} )
} )
路由讲解
ginServer. GET ( "/json" , func ( context * gin. Context) {
context. Redirect ( http. StatusMovedPermanently, "https://www.4399.com" )
} )
ginServer. NoRoute ( func ( context * gin. Context) {
context. Redirect ( http. StatusNotFound, "404.html" , nil )
} )
userGroup := ginServer. Group ( "/user" ) {
userGroup. POST ( "/add" , func )
userGroup. POST ( "/login" , func )
userGroup. POST ( "/logout" , func )
}
orderGroup := ginServer. Group ( "/order" ) {
orderGroup. POST ( "/add" , func )
orderGroup. DELETE ( "/delete" , func )
}
中间件
func myHandler ( ) ( gin. HandlerFunc) {
return func ( context * gin. Context) {
context. Set ( "usersession" , "userid-1" )
if condition {
context. Next ( )
} else {
context. Abort ( )
}
}
}
ginServer. GET ( "/user/info" , myHandler ( ) , func ( context * gin. Context) {
usersession := context. MustGet ( "userSession" ) . ( string )
log. Println ( "userSession" , usersession)
userid := context. Query ( "userid" )
username := context. Query ( "username" )
context. JSON ( http. StatusOK, gin. H {
"userid" : userid,
"username" : username,
} )
} )