书接上回,我们已经安装好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模板来将数据实时渲染至页面中,欲知后事如何,且听下回分解。

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

  1. 急如闪电快如风,彩虹女神跃长空,Go语言高性能Web框架Iris项目实战-初始化项目ep00

    在Golang Web编程的世界里,君不言高性能则已,言高性能必称Iris.彩虹女神的名号响彻寰宇.名动江湖,单论一个快字,无人能出其右,就连以简洁轻量著称于世的Gin也难以望其项背,只见彩虹女神Ir ...

  2. go语言,golang学习笔记2 web框架选择

    go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...

  3. 最好的6个Go语言Web框架

    原文:Top 6 web frameworks for Go as of 2017 作者:Edward Marinescu 译者:roy 译者注:本文介绍截至目前(2017年)最好的6个Go语言Web ...

  4. 探讨后端选型中不同语言及对应的Web框架

    在进行后端选型的时候,实际上我们要选择的是一个框架.后端领域所使用的技术和框架已经趋于稳定,我们只需要按我们的需要选择所需要的框架.当存在多个框架适合时,我们再选择适合的语言.不得不指出的是,当我们喜 ...

  5. go语言最快最好运用最广的web框架比较(大多数人不了解的特性)

    令人敬畏的Web框架 如果你为自己设计一个小应用程序,你可能不需要一个Web框架,但如果你正在进行生产,那么你肯定需要一个,一个好的应用程序. 虽然您认为自己拥有必要的知识和经验,但您是否愿意自行编写 ...

  6. 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架

    在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...

  7. go语言几个最快最好运用最广的web框架比较

    比较一下常用的golang web框架 令人敬畏的Web框架 如果你为自己设计一个小应用程序,你可能不需要一个Web框架,但如果你正在进行生产,那么你肯定需要一个,一个好的应用程序. 虽然您认为自己拥 ...

  8. 【R笔记】R语言进阶之4:数据整形(reshape)

    R语言进阶之4:数据整形(reshape) 2013-05-31 10:15 xxx 网易博客 字号:T | T 从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数 ...

  9. 《C语言进阶剖析》课程目录

    <C语言进阶剖析>学习笔记                                                         本文总结自狄泰软件学院唐佐林老师的<C语言 ...

随机推荐

  1. [2-SAT]编码

    题意:给n个01字符串,每个最多包含1个'?',能否构造出满足两两不存在一个是另一个前缀的方案. 思路: 2-SAT+trie树优化建图 把每个字符串拆成i,i+n,如果不存在'?',就硬搞出两种情况 ...

  2. 基于RabbltMQ延迟插件实现延迟队列代码示例

    上一篇文章写了docker安装RabbitMQ及延迟插件的安装,这篇的话是基于RabbitMQ延迟插件实现延迟队列的示例 那么废话不多说 直接上代码!! 首先创建延迟队列配置类 DelayedQueu ...

  3. MVC - MVC的工作流程

    MVC 是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应 ...

  4. React Suspense 尝鲜,处理前后端IO异步操作

    简单介绍一下Suspense Suspense主要用来解决网络IO问题,它早在2018年的React 16.6.0版本中就已发布.它的相关用法有些已经比较成熟,有的相对不太稳定,甚至经历了重命名.删除 ...

  5. 静态代理、动态代理与Mybatis的理解

    静态代理.动态代理与Mybatis的理解 这里的代理与设计模式中的代理模式密切相关,代理模式的主要作用是为其他对象提供一种控制对这个对象的访问方法,即在一个对象不适合或者不能直接引用另一个对象时,代理 ...

  6. gulp入门第一课你需要注意的

    安装 1.首先确保你已经正确安装了nodejs环境.然后以全局方式安装gulp. npm install -g gulp 2.初始化项目. npm init 3.如果想在安装的时候把gulp写进项目p ...

  7. java+mybatis实现一个简单的银行系统,实现存取款与账户查询

    先创建数据库和表,使用的是MySQL数据库. create database mybatis; use mybatis; CREATE TABLE `accountdo` ( `id` varchar ...

  8. cve-2021-42287和cve-2021-42278漏洞复现

    一.漏洞概述 cve-2021-42287 : 由于Active Directory没有对域中计算机与服务器账号进行验证,经过身份验证的攻击 者利用该漏洞绕过完全限制,可将域中普通用户权限提升为域管理 ...

  9. Servlet 之 Http协议

    请求消息数据格式 请求行  请求方式 请求url 请求协议或者版本 (GET    /login.html   HTTP/1.1) 请求头 请求头名称:请求头值 多个用逗号分隔 请求空行  空行分隔作 ...

  10. tomcat 的安全配置预防后台被攻击

    安全是系统架构中最重要的关注点之一,通常情况下,所说的安全涵盖网络安全.数据安全.操作系统安全.服务器安全以及应用系统安全等诸多方面. Tomcat 是一个免费的开放源代码 的Web应用服务器,技术先 ...