写点什么

彩虹女神跃长空,Go 语言进阶之 Go 语言高性能 Web 框架 Iris 项目实战 - 项目入口与路由 EP01

  • 2022 年 8 月 16 日
    北京
  • 本文字数:3582 字

    阅读完需:约 12 分钟

彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01

书接上回,我们已经安装好 Iris 框架,并且构建好了 Iris 项目,同时配置了 fresh 自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发。现在我们来看看 Iris 的基础功能,如何编写项目入口文件以及配置路由系统。

项目入口

事实上,Iris 遵循的是单一入口模式,说白了就是单一入口文件 main.go 处理项目所有的来源请求,如此,项目就避免了因为多个文件处理不同的请求而增加的安全性风险,同时也更便于项目的统筹管理。在上一篇文章:急如闪电快如风,彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-初始化项目EP00中,我们已经编写好了入口文件 main.go:


package main    import "github.com/kataras/iris/v12"    func main() {    app := iris.New()    app.Use(iris.Compression)      app.Get("/", func(ctx iris.Context) {      ctx.HTML("你好 <strong>%s</strong>!", "女神")    })      app.Listen(":5000")  }
复制代码


这里解释一下各行代码含义,首先声明包名:


package main
复制代码


随后导入 Iris 包,注意这里的版本是最新的 v12:


import "github.com/kataras/iris/v12"
复制代码


接着声明入口(main)函数,并且初始化 Iris 结构体:


app := iris.New()
复制代码


随后加载 iris.Compression 模块:


app.Use(iris.Compression)
复制代码


这里 Compression 是 Iris 内部对 IO 数据进行压缩的模块,可以提高数据传输速度。


接着编写路由注册,并使用 ctx 结构体变量来打印数据:


app.Get("/", func(ctx iris.Context) {      ctx.HTML("你好 <strong>%s</strong>!", "女神")    })
复制代码


最后监听系统的 5000 端口:


app.Listen(":5000")
复制代码


在此基础上,进行进一步的改造:


type Article struct {    Title string `json:"标题"`  }
复制代码


这里我们声明一个叫做 Artile(文章)的结构体,该结构体可以理解为博客系统中文章的对象类,结构体内有一个数据类型为字符串的字段(属性)Title(标题),其隐射到 Json 结果的描述为“标题”。


接着声明函数:


func list(ctx iris.Context) {    article := []Article{      {"iris第一章"},      {"iris第二章"},      {"iris第三章"},    }      ctx.JSON(article)    }
复制代码


这里我们声明一个叫做 list 的函数,参数为 ctx 结构体,作用是将文章的标题列表(切片),通过 Json 的形式返回。


最后将全局注册的路由,改造为子路由注册:


articleAPI := app.Party("/")    {      articleAPI.Use(iris.Compression)      articleAPI.Get("/", list)      }
复制代码


这里使用 Iris 结构体变量内置的 Party 方法。


完成入口文件代码:


package main    import "github.com/kataras/iris/v12"    func main() {    app := iris.New()      articleAPI := app.Party("/")    {      articleAPI.Use(iris.Compression)      articleAPI.Get("/", list)      }      app.Listen(":5000")  }    type Article struct {    Title string `json:"标题"`  }    func list(ctx iris.Context) {    article := []Article{      {"iris第一章"},      {"iris第二章"},      {"iris第三章"},    }      ctx.JSON(article)    }
复制代码


修改完毕后,fresh 服务会自动帮我们重新编译项目,然后访问 http://localhost:5000


浏览器显示:


[  {  标题: "iris第一章"  },  {  标题: "iris第二章"  },  {  标题: "iris第三章"  }  ]
复制代码


如此,通过入口文件返回子路由结构体数据的例子就完成了。

路由与请求方式

除了 GET 请求方式,Iris 也支持其他的一些请求方式,一共八种:




app.Get("/someGet", getting) app.Post("/somePost", posting) app.Put("/somePut", putting) app.Delete("/someDelete", deleting) app.Patch("/somePatch", patching) app.Header("/someHead", head) app.Options("/someOptions", options)
复制代码


这里只需要将对应的函数进行绑定即可,比如:


func testpost(ctx iris.Context) {      ctx.WriteString("post请求测试")    }
复制代码


随后绑定 Post 请求:


articleAPI.Post("/", testpost)
复制代码


接着编写请求脚本,在项目以外的目录下建立 tests.go 文件:


package main    import (    "fmt"    "io/ioutil"    "net/http"    "strings"  )    func main() {      resp, err := http.Post("http://localhost:5000", "application/json;charset=utf-8", strings.NewReader("name=test"))    if err != nil {      fmt.Println(err)      return    }      body, err := ioutil.ReadAll(resp.Body)      fmt.Println(string(body))    }
复制代码


这里通过 http 包的 Post 方法来请求 http://localhost:5000


系统返回:


post请求测试
复制代码


没有问题。

路由传参

在 Iris 的路由体系中,我们可以直接通过网址进行参数的传递:


app.Get("/user/{name}", func(ctx iris.Context) {        name := ctx.Params().Get("name")        ctx.Writef("Hello %s", name)      })
复制代码


随后编写请求脚本:


package main    import (    "fmt"    "io/ioutil"    "net/http"  )    func main() {      resp, err := http.Get("http://localhost:5000/user/123")    if err != nil {      fmt.Println(err)      return    }      body, err := ioutil.ReadAll(resp.Body)      fmt.Println(string(body))    }
复制代码


程序返回:


Hello 123
复制代码


需要注意的是,这种传参方式并不会匹配单独的/user 路径,所以参数不能为空才能匹配到。


如果参数为空,也需要向下匹配,可以采用这种方式:


app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {          name := ctx.Params().Get("name")          action := ctx.Params().Get("action")          message := name + " is " + action          ctx.WriteString(message)      })
复制代码


同时也可以声明参数类型:


app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {          ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true      })
复制代码


Iris 内置支持的参数类型:




Param Type Go Type Validation Retrieve Helper :string string anything (single path segment) Params().Get :uuid string uuidv4 or v1 (single path segment) Params().Get :int int -9223372036854775808 to 9223372036854775807 (x64) or -2147483648 to 2147483647 (x32), depends on the host arch Params().GetInt :int8 int8 -128 to 127 Params().GetInt8 :int16 int16 -32768 to 32767 Params().GetInt16 :int32 int32 -2147483648 to 2147483647 Params().GetInt32 :int64 int64 -9223372036854775808 to 9223372036854775807 Params().GetInt64 :uint uint 0 to 18446744073709551615 (x64) or 0 to 4294967295 (x32), depends on the host arch Params().GetUint :uint8 uint8 0 to 255 Params().GetUint8 :uint16 uint16 0 to 65535 Params().GetUint16 :uint32 uint32 0 to 4294967295 Params().GetUint32 :uint64 uint64 0 to 18446744073709551615 Params().GetUint64 :bool bool "1" or "t" or "T" or "TRUE" or "true" or "True" or "0" or "f" or "F" or "FALSE" or "false" or "False" Params().GetBool :alphabetical string lowercase or uppercase letters Params().Get :file string lowercase or uppercase letters, numbers, underscore (_), dash (-), point (.) and no spaces or other special characters that are not valid for filenames Params().Get :path string anything, can be separated by slashes (path segments) but should be the last part of the route path Params().Get
复制代码


除此以外,Iris 也支持传统的传参方式:


func main() {      app := iris.Default()        // Query string parameters are parsed using the existing underlying request object.      // The request responds to a url matching:  /welcome?firstname=Jane&lastname=Doe      app.Get("/welcome", func(ctx iris.Context) {          firstname := ctx.URLParamDefault("firstname", "Guest")          lastname := ctx.URLParam("lastname") // shortcut for ctx.Request().URL.Query().Get("lastname")            ctx.Writef("Hello %s %s", firstname, lastname)      })      app.Listen(":8080")  }
复制代码


这里注意,如果参数为空,可以通过 ctx 结构体绑定 URLParamDefault 方法来设置默认值。

结语

通过 Iris 内置的路由、模型结构体、以及对应的结构体绑定方法,我们已经可以实现普通请求的响应,同时通过多种方式获取到请求的参数,下一步,将会结合 Iris 模板来将数据实时渲染至页面中,欲知后事如何,且听下回分解。

发布于: 刚刚阅读数: 2
用户头像

专注技术,凝聚意志,解决问题 v3u.cn 2020.12.21 加入

还未添加个人简介

评论

发布
暂无评论
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01_Go_刘悦的技术博客_InfoQ写作社区