Iris自称是Go语言中所有Web框架最快的,它的特点如下:
- 聚焦高性能
- 健壮的静态路由支持和通配符子域名支持。
- 视图系统支持超过5以上模板
- 支持定制事件的高可扩展性Websocket API
- 带有GC, 内存 & redis 提供支持的会话
- 方便的中间件和插件
- 完整 REST API
- 能定制 HTTP 错误
- Typescript编译器 + 基于浏览器的编辑器
- 内容 negotiation & streaming
- 传送层安全性
- 源码改变后自动加载
- OAuth, OAuth2 支持27+ API providers
- JSON Web Tokens
使用 iris 实现 REST API
安装Iris
go get github.com/kataras/iris
一、GET
1.不需要传参的GET
接口
package main
import "github.com/kataras/iris"
func main() {
//获取一个iris对象
app := iris.New()
//绑定路由/login,访问后输出LOGIN
app.Handle("GET","/login", func(ctx iris.Context) {
ctx.JSON("LOGIN")
})
//在8080端口启动服务
app.Run(iris.Addr(":8080"))
}
执行代码,浏览器访问http://localhost:8080/login
,如果没有问题,窗口将会显示"LOGIN"
2.需要传参的GET
接口
package main
import (
"github.com/kataras/iris"
"fmt"
)
func main() {
//获取一个iris对象
app := iris.New()
//绑定路由/login/{用户名}/{密码},访问后输出用户名,密码
app.Handle("GET", "/login/{username}/{password}", func(ctx iris.Context) {
//获取参数值
username := ctx.Params().Get("username")
fmt.Println(username)
password := ctx.Params().Get("password")
fmt.Println(password)
data := &struct {
Username string
Password string
}{
Username: username,
Password: password,
}
ctx.JSON(data)
})
//在8080端口启动服务
app.Run(iris.Addr(":8082"))
}
iris
中GET
接口传参采用{}
加key
值的方式 获取参数通过ctx.Params().Get(key)
执行代码,浏览器访问http://localhost:8082/login/zhq/123
,如果没有问题,窗口将会显示{"password":"123","username":"zhq"}
二、POST
1.接收的是字符串的处理
func postAPI(app *iris.Application) {
//绑定路由/login/{用户名}/{密码},访问后输出用户名,密码
app.Handle("POST", "/regist", func(ctx iris.Context) {
//获取参数值
username := ctx.FormValue("username")
fmt.Println("==",username)
password := ctx.FormValue("password")
fmt.Println(password)
data := &struct {
Username string
Password string
}{
Username: username,
Password: password,
}
ctx.JSON(data)
})
}
执行代码,打开终端执行curl
命令模拟POST
请求
zhangqiangdeMac-mini:~ zhqmac$ curl localhost:8080/regist -d ‘user=zhq&password=123456’ -X POST
输出结果:
{“Username”:””,”Password”:”123456”}
2.接收的是JSON
数据的处理
func postAPI_2(app *iris.Application) {
//绑定路由/login/{用户名}/{密码},访问后输出用户名,密码
app.Handle("POST", "/regist", func(ctx iris.Context) {
data := &struct {
Username string `json:"username"`
Password string `json:"password"`
}{}
//读取JSON数据
ctx.ReadJSON(data)
fmt.Println(data.Username,"==",data.Password)
ctx.JSON(data)
})
}
执行代码,打开终端执行curl
命令模拟POST
请求
zhangqiangdeMac-mini:~ zhqmac$ curl -H “Content-Type:application/json” -X POST –data ‘{“username”:”zhq”,”password”:”123456”}’ http://localhost:8080/regist
运行结果:
{“username”:”zhq”,”password”:”123456”}
三、PUT
PUT
和POST
在技术实现上是没有很大区别的。在上面的代码中将POST
改成PUT
即可,但在于协议上语义是很大区别的。
1.POST
用于提交请求,可以更新或者创建资源,是非幂等的
举个例子,在我们的支付系统中,一个api的功能是创建收款金额二维码,它和金额相关,每个用户可以有多个二维码,如果连续调用则会创建新的二维码,这个时候就用POST
2.PUT
用于向指定的URI传送更新资源,是幂等的
还是那个例子,用户的账户二维码只和用户关联,而且是一一对应的关系,此时这个api就可以用PUT,因为每次调用它,都将刷新用户账户二维码
3.什么是幂等
对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a)) 。 对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x
4.当需要以更新的形式来修改某一具体资源的时候,如何判断用PUT还是POST呢?
很简单,如果该更新对应的URI多次调用的结果一致,则PUT
比如更新某个blog文章,因为该文章具有单一的具体URI,所以每次更新提交相同的内容,结果都一致
/blog/{document_id}/update
在每次更新提交相同的内容,最终的结果不一致的时候,用POST
举个很常见的例子,一个接口的功能是将当前余额减一个值,每次提交指定该值为100,接口如下
/amount/deduction
调用一次,你的余额-100,调用两次,余额-200
这个时候就用POST
demo下载 https://github.com/sweetMegan/irisDemo
参考资料:
https://my.oschina.net/liujiest/blog/738992
https://my.oschina.net/u/1263964/blog/268932
https://baike.baidu.com/item/URI/2901761?fr=aladdin