web框架:Iris快速入门

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 web框架:Iris快速入门,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

web框架:Iris快速入门

1 介绍及安装

  1. 介绍
  • Iris是一款用Go开发的web应用框架,被称为速度最快的Go后端开发框架。
  • 官网地址:https://www.iris-go.com/
  • 中文教程地址:http://www.codebaoku.com/iris/iris-index.html
  1. 安装

环境要求:iris 框架要求 golang 版本至少为1.8。可以通过打开终端,执行:go version 命令来查看自己机器的go环境版本。

安装 iris 框架非常简单,使用 go 语言的全局安装第三方代码的命令 get 即可。

go get -u github.com/kataras/iris
  1. 启动一个简单的iris服务
package main

import "github.com/kataras/iris"

func main() {
	//1. 创建app结构体对象
	app := iris.New()
	//2. 端口监听
	app.Run(iris.Addr(":8082"))
}

bug:Assets undefined (type *blocks.Blocks has no field or method Assets)

  • 解决办法:
  1. 根据对应路径删除kataras目录
  2. 在对应路径下执行go mod init
  3. 重新下载指定版本
go get github.com/kataras/iris/v12@latest
// 或者
go get github.com/kataras/iris/v12@master

2 RESTFul风格、请求参数、响应处理

2.1 RESTFul风格【GET、POST…】

  • HTTP1.0定义了三种请求方法:GET、POST、HEAD
  • HTTP1.1新增了五种方法:OPTIONS、PUT、DELETE、TRACE、CONNECT
    因此,目前HTTP一共定义了八种方法对应不同的资源操作方式
package main

import (
	"github.com/kataras/iris/v12"
	_ "github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
	"net/http"
)

func main() {
	//创建实例
	app := iris.New()
	//RESTFul请求方式
	//1. GET
	app.Get("/user", func(context *context.Context) {
		path := context.Path()
		app.Logger().Info(path)
		context.JSON(map[string]interface{}{
			"code": http.StatusOK,
			"msg":  "处理get请求成功,查询用户信息",
		})
	})

	//2. 处理POST
	app.Post("/user", func(context *context.Context) {
		path := context.Path()
		context.WriteString("处理POST请求成功,请求路径:" + path)
	})

	//3. 其他请求方式同理

	//监听端口
	app.Run(iris.Addr(":8082"))
}

  • GET:
    在这里插入图片描述
  • POST结果:
    在这里插入图片描述

2.2 请求参数处理

package main

import (
	"github.com/kataras/iris/v12"
	_ "github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
)

func main() {
	//创建实例
	app := iris.New()
	//请求参数处理
	//1. param 		//localhost:8082/testParam?username=zhangsan&password=123
	app.Get("/testParam", func(context *context.Context) {
		username := context.URLParam("username")
		password := context.URLParam("password")
		//返回html数据格式
		context.HTML("<h1>" + username + "," + password + "</h1>")
	})

	//2. PathVariable	//localhost:8082/testPathVariable/wangwu/13
	//app.Get("/testPathVariable/{username:string}/{age:int}") //限定请求参数类型 username:string 、 age:int
	app.Get("/testPathVariable/{username}/{password}", func(context *context.Context) {
		username := context.Params().Get("username")
		password := context.Params().Get("password")
		context.WriteString("响应成功:" + username + "," + password)
	})

	//3. form表单
	app.Post("/testForm", func(context *context.Context) {
		username := context.PostValue("username")
		pwd := context.PostValue("password")
		context.WriteString("接收表单数据成功:" + username + "," + pwd)
	})

	//4. JSON数据
	app.Post("/testJson", func(context *context.Context) {
		var person Person
		if err := context.ReadJSON(&person); err != nil {
			panic(err.Error())
		}
		context.Writef("接收JSON数据成功:%v", person)
	})

	//5. XMl格式数据
	app.Post("/testXML", func(context *context.Context) {
		var stu Student
		if err := context.ReadXML(&stu); err != nil {
			panic(err.Error())
		}
		context.Writef("接收XML数据成功:%v", stu)
	})

	//监听端口
	app.Run(iris.Addr(":8082"))
}

// 用于解析JSON
type Person struct {
	//字段需要是大写,否则为私有,底层无法设置值
	Name string `json:name`
	Pwd  string `json:pwd`
}

// 用于解析XML
type Student struct {
	Name string `xml:stu_name`
	Age  int    `xml:stu_age`
}

示例:

  • form表单:
    在这里插入图片描述
  • JSON数据:
    在这里插入图片描述

2.3 响应结果处理

package main

import (
	"github.com/kataras/iris/v12"
	_ "github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
)

func main() {
	//创建实例
	app := iris.New()
	//响应参数处理
	//1. 返回HTML数据
	app.Get("/getHtml", func(context *context.Context) {
		context.HTML("<h1> 返回HTML数据成功</h1>")
	})

	//2. 返回json数据
	app.Get("/getJson", func(context *context.Context) {
		context.JSON(iris.Map{"code": 200, "msg": "返回json数据成功"})
	})

	//3. 返回XMl数据
	app.Get("/getXMl", func(context *context.Context) {
		context.XML(Student{StuName: "jackson", StuAge: 25})
	})

	//4. 返回string类型
	app.Get("/getString", func(context *context.Context) {
		context.WriteString("返回string类型数据成功")
	})

	//监听端口
	app.Run(iris.Addr(":8082"))
}

// 用于解析JSON
type Person struct {
	//字段需要是大写,否则为私有,底层无法设置值
	Name string `json:name`
	Pwd  string `json:pwd`
}

// 用于解析XML
type Student struct {
	StuName string `xml:stu_name`
	StuAge  int    `xml:stu_age`
}
  • 返回XML格式数据
    在这里插入图片描述
package main

import (
	"github.com/aobco/log"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
)

// User 传输XML格式的时候需要把最外层的<user></user>带上
type User struct {
	Id   int    `json:"id" xml:"id"`
	Name string `json:"name" xml:"name"`
}

func main() {
	/*
		处理请求参数
	*/
	//创建iris对象
	app := iris.New()
	//①处理json请求参数
	app.Post("/handleJson", func(context *context.Context) {
		var user User
		err := context.ReadJSON(&user)
		if err != nil {
			context.WriteString("invalid Json...")
			context.StatusCode(iris.StatusBadRequest)
			return
		}
		context.WriteString("handle json request param success...")
		log.Infof("user=%v", user)
	})
	//②处理form请求参数
	app.Post("/handleForm", func(c *context.Context) {
		name := c.FormValue("name")
		age := c.FormValue("age")
		c.WriteString("handle form request param success...")
		log.Infof("name=%v, age=%v", name, age)
	})

	//③处理PathVariable
	app.Get("/users/{id:int}", func(ctx *context.Context) {
		id, err := ctx.Params().GetInt("id")
		if err != nil {
			ctx.WriteString("handle pathVariable failed...")
			return
		}
		ctx.WriteString("handle pathVariable param success...")
		log.Infof("handle pathVariable success...id=%v", id)
	})

	//④处理URLParam
	app.Get("/users", func(ctx *context.Context) {
		name := ctx.URLParam("name")
		age := ctx.URLParam("age")
		ctx.WriteString("handle URLParam success...")
		log.Infof("name=%v, age=%v", name, age)
	})

	//⑤解析XML
	//<user>
	//	<id>3</id>
	//	<name>unmard</name>
	//</user>
	app.Post("/handleXML", func(ctx *context.Context) {
		var user User
		err := ctx.ReadXML(&user)
		if err != nil {
			ctx.WriteString("handle XML err...")
			ctx.StatusCode(iris.StatusBadRequest)
			return
		}
		ctx.WriteString("handle XML success...")
		log.Infof("user=%v", user)
	})

	//监听8082端口
	app.Run(iris.Addr(":8082"))
}

3 路由功能

package main

import (
	"github.com/kataras/iris/v12"
	_ "github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
)

func main() {
	//创建实例
	app := iris.New()
	//路由功能
	//1. handle方式处理请求 [method:GET、POST等都行]
	app.Handle("GET", "/userinfo", func(context *context.Context) {
		context.WriteString("handle方式处理请求成功...")
	})

	//2. 自定义表达式获取路由
	app.Get("/api/users/{userid:uint64}", func(context *context.Context) {
		userId, err := context.Params().GetUint("userid")
		if err != nil {
			context.JSON(iris.Map{
				"code": 201,
				"msg":"bad request",
			})
		}
		context.Writef("处理请求成功:%v", userId)
	})
	
	//3. 路由组
	userParty := app.Party("/users", func(context *context.Context) {
		//处理下一级请求
		context.Next()
	})
	// URL:  localhost:8082/users/login
	userParty.Get("/login", func(context *context.Context) {
		context.Writef("处理登录请求成功,请求路径:%v", context.Path())
	})

	
	goodsParty := app.Party("/goods", userMiddleware)
	goodsParty.Post("/add", func(context *context.Context) {
		context.WriteString("添加商品成功..." + context.Path())
	})
	
	//监听端口
	app.Run(iris.Addr(":8082"))
}

//用户路由中间件【拦截器】
func userMiddleware(context iris.Context)  {
	context.Next()
}

在这里插入图片描述

4 iris配置处理(读取配置文件)

package main

import (
	"github.com/kataras/iris/v12"
)

func main() {
	app := iris.New()
	//1. 通过代码进行全局配置
	app.Configure(iris.WithConfiguration(iris.Configuration{
		//如果设置为true,当人为中断程序执行之,则不会自动正常将服务器关闭,如果设置为false,需要自己自定义处理
		DisableInterruptHandler: false,
		//是否路由重定向,默认为false
		DisablePathCorrection: false,
		EnablePathEscape: false,
		FireMethodNotAllowed: false,
		DisableBodyConsumptionOnUnmarshal: false,
		DisableAutoFireStatusCode: false,
		TimeFormat: "Mon,02 Jan 2006 15:04:05 GMT",
		Charset: "utf-8",
	}))
	
	//2. 通过配置文件读取【需要在run方法之前执行】
	//toml
	app.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.toml")))
	//yml
	app.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.yml")))
	//json
	app.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.json")))
	
	app.Run(iris.Addr(":8082"))
}

5 mvc包的使用

package main

import (
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/mvc"
)

//controller
type UserController struct{}

//1. controller中对应的GetInfo方法
//iris的mvc包中会自动为我们匹配,例如:GetInfo方法会为我们匹配 http://localhost:8082/info [GET请求]
func (uc *UserController) GetInfo() mvc.Result {
	iris.New().Logger().Info("get请求,请求路径为info")
	return mvc.Response{
		Object: map[string]interface{}{
			"code":    1,
			"message": "请求成功",
		},
	}
}

//localhost:8082 [GET请求]
func (uc *UserController) Get() string {
	iris.New().Logger().Info("Get请求")
	return "UserController匹配get请求成功...."
}

//注意:只能首字母大写,如果写成POST则匹配不到
func (uc *UserController) Post() string {
	iris.New().Logger().Info("post请求")
	return "UserController匹配post请求成功...."
}

type BookController struct{}

func (bc *BookController) Put() string {
	iris.New().Logger().Info("bookController 接收到put请求")
	return "bookController 匹配put请求成功..."
}

func main() {
	app := iris.New()
	//mvc 包的使用
	//mvc.Configure(app.Party("/user))
	//将UserController绑定到mvc上
	mvc.New(app).Handle(new(UserController))
	mvc.New(app).Handle(new(BookController))
	app.Run(iris.Addr(":8082"))
}

结果:

  • UserController.Get()
    在这里插入图片描述
  • UserController.GetInfo()
    在这里插入图片描述
  • BookController.Put()
    在这里插入图片描述

6 session的使用和控制

package main

import (
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
	"github.com/kataras/iris/v12/sessions"
)

var (
	USERNAME = "username"
	ISLOGIN  = "isLogin"
)

func main() {
	app := iris.New()
	//session的使用
	//1. 创建session并进行使用
	sessionID := "mySession"
	sess := sessions.New(sessions.Config{
		Cookie: sessionID,
	})
	/*
		【1】用户登录功能,登录成功之后保存session
	*/
	app.Post("/login", func(context *context.Context) {
		userName := context.PostValue("name")
		passwd := context.PostValue("pws")
		if userName == "jack" && passwd == "123" {
			//向session中设置值
			session := sess.Start(context)
			session.Set(USERNAME, userName)
			session.Set(ISLOGIN, true)

			context.WriteString("账户登录成功")
		} else {
			session := sess.Start(context)
			session.Set(ISLOGIN, false)
			context.WriteString("账户登录失败, 请重新尝试")
		}
	})

	/*
		【2】用户退出之后,删除sessino
	*/
	app.Get("/logout", func(context *context.Context) {
		session := sess.Start(context)
		//删除session中的数据
		session.Delete(ISLOGIN)
		context.WriteString("退出登录成功.....")
	})

	/*
		【3】查询用户登录信息
	*/
	app.Get("/query", func(context *context.Context) {
		session := sess.Start(context)
		//查询用户是否登录【ISLOGIN是bool类型,因此这里直接通过GetBoolean】
		isLogin, err := session.GetBoolean(ISLOGIN)
		if err != nil {
			context.WriteString("账户未登录,请先登录")
		}
		if isLogin {
			username := session.GetString(USERNAME)
			context.WriteString("账户信息:" + username)
		} else {
			context.WriteString("账户未登录")
		}
	})
	app.Run(iris.Addr(":50000"))
}

  1. 登录请求
    在这里插入图片描述

  2. 查询用户信息
    在这里插入图片描述

  3. 退出登录
    在这里插入图片描述

  4. 查询用户信息
    在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/148504.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!