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

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

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

相关文章
|
12天前
|
缓存 前端开发 JavaScript
构建高性能与用户体验并重的现代Web应用
构建高性能与用户体验并重的现代Web应用
29 5
|
13天前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
23 4
|
3月前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
39 0
|
3月前
|
开发者 自然语言处理 存储
语言不再是壁垒:掌握 JSF 国际化技巧,轻松构建多语言支持的 Web 应用
【8月更文挑战第31天】JavaServer Faces (JSF) 框架提供了强大的国际化 (I18N) 和本地化 (L10N) 支持,使开发者能轻松添加多语言功能。本文通过具体案例展示如何在 JSF 应用中实现多语言支持,包括创建项目、配置语言资源文件 (`messages_xx.properties`)、设置 `web.xml`、编写 Managed Bean (`LanguageBean`) 处理语言选择,以及使用 Facelets 页面 (`index.xhtml`) 显示多语言消息。通过这些步骤,你将学会如何配置 JSF 环境、编写语言资源文件,并实现动态语言切换。
40 0
|
3月前
|
UED 存储 自然语言处理
【语言无界·体验无疆】解锁Vaadin应用全球化秘籍:从代码到文化,让你的应用畅游世界每一个角落!
【8月更文挑战第31天】《国际化与本地化实战:构建多语言支持的Vaadin应用》详细介绍了如何使用Vaadin框架实现应用的国际化和本地化,提升用户体验和市场竞争力。文章涵盖资源文件的创建与管理、消息绑定与动态加载、日期和数字格式化及文化敏感性处理等方面,通过具体示例代码和最佳实践,帮助开发者构建适应不同语言和地区设置的Vaadin应用。通过这些步骤,您的应用将更加灵活,满足全球用户需求。
56 0
|
3月前
|
API 数据库 UED
全面解析构建高性能API的秘诀:运用Entity Framework Core与异步编程提升Web应用响应速度及并发处理能力的详细指南与实践案例
【8月更文挑战第31天】本文详细介绍了如何利用 Entity Framework Core (EF Core)的异步编程特性构建高性能 API。通过创建基于 EF Core 的 .NET Core Web API 项目,配置数据库上下文,并定义领域模型,文章展示了如何使用异步方法进行数据查询、加载相关实体及事务处理。具体代码示例涵盖了 GET、POST、PUT 和 DELETE 操作,全面展示了 EF Core 异步编程的优势,有助于提升 API 的响应速度和处理能力。
42 0
|
3月前
|
Rust 安全 Java
Rust语言在Web后端的应用:基于Actix-web构建高性能、安全可靠的服务器实践
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的无限潜力。
139 0
|
3月前
|
监控 Java API
Spring Boot中的异步革命:构建高性能的现代Web应用
【8月更文挑战第29天】Spring Boot 是一个简化 Spring 应用开发与部署的框架。异步任务处理通过后台线程执行耗时操作,提升用户体验和系统并发能力。要在 Spring Boot 中启用异步任务,需在配置类上添加 `@EnableAsync` 注解,并定义一个自定义的 `ThreadPoolTaskExecutor` 或使用默认线程池。通过 `@Async` 注解的方法将在异步线程中执行。异步任务适用于发送电子邮件、数据处理、外部 API 调用和定时任务等场景。最佳实践中应注意正确配置线程池、处理返回值和异常、以及监控任务状态,确保系统的稳定性和健壮性。
41 0
|
3月前
|
缓存 监控 Linux
在Linux中,如何设计一个高性能的Web服务器?
在Linux中,如何设计一个高性能的Web服务器?
|
3月前
|
缓存 监控 中间件
构建高效的Go语言Web服务器:基于Fiber框架的性能优化实践
在追求极致性能的Web开发领域,Go语言(Golang)凭借其高效的并发处理能力、垃圾回收机制及简洁的语法赢得了广泛的青睐。本文不同于传统的性能优化教程,将深入剖析如何在Go语言环境下,利用Fiber这一高性能Web框架,通过精细化配置、并发策略调整及代码层面的微优化,构建出既快速又稳定的Web服务器。通过实际案例与性能测试数据对比,揭示一系列非直觉但极为有效的优化技巧,助力开发者在快节奏的互联网环境中抢占先机。