go iris 实现GET、POST、PUT接口

Iris自称是Go语言中所有Web框架最快的,它的特点如下:

  1. 聚焦高性能
  2. 健壮的静态路由支持和通配符子域名支持。
  3. 视图系统支持超过5以上模板
  4. 支持定制事件的高可扩展性Websocket API
  5. 带有GC, 内存 & redis 提供支持的会话
  6. 方便的中间件和插件
  7. 完整 REST API
  8. 能定制 HTTP 错误
  9. Typescript编译器 + 基于浏览器的编辑器
  10. 内容 negotiation & streaming
  11. 传送层安全性
  12. 源码改变后自动加载
  13. OAuth, OAuth2 支持27+ API providers
  14. 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"))
}

irisGET接口传参采用{}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

PUTPOST在技术实现上是没有很大区别的。在上面的代码中将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

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦