当前位置: 首页 > news >正文

Go web 开发框架 Iris

背景

掌握了 Go 语言的基础后就该开始实践了,编写Web应用首先需要一个 web 开发框架。做框架选型时,处理web请求是基本功能,至于MVC是更进一步需要。现在比较流行的web架构是前后端分离,后端响应RESTful的请求,Iris 能满足我们的需要。

Iris简介

它是用Go编写的一个相当新的web框架。它是精心编写的最快的HTTP/2 web 框架。IRIS提供了相当优美的表达语法,和简单易用的框架支持你开发网站、API或分布式应用程序

简单来说Iris的特点:

  • 语法简单
  • 小巧,轻量,快
  • 支持中间件(插件,请求拦截)
  • 支持 开发网站、API或分布式应用程序

本文结构:

代码语言:javascript

复制

开始吧导入包设定一些参数和启动:响应 HTTP 中的各种方法(method): Get, Post, Put, Patch, Delete 和 Options从 请求 中获得参数的值从查询字符串( QueryString )中获得值从表单(Form) 中获得值上传文件支持对路由的分组中间件写入日志到文件中Cookie 操作处理跨域CORS

开始吧

导入包
设定一些参数和启动:

开始吧

导入包

一些说明:

  • iris包: github.com/kataras/iris/v12
  • iris的日志:github.com/kataras/iris/v12/middleware/logger
  • 能够在崩溃时记录和恢复:github.com/kataras/iris/v12/middleware/recover

代码示例: package main

import ("github.com/kataras/iris/v12""github.com/kataras/iris/v12/middleware/logger""github.com/kataras/iris/v12/middleware/recover"
)
设定一些参数和启动:

func main() {app := iris.New()app.Logger().SetLevel("debug")// 可选的,recover 和logger 是内建的中间件,帮助在 崩溃时记录和恢复app.Use(recover.New())app.Use(logger.New())// GET方法 返回一个 HTML// 示例 URL :  http://localhost:8080app.Handle("GET", "/", func(ctx iris.Context) {ctx.HTML("<h1>Welcome</h1>")})//  GET方法 返回 字符串// 示例 URL :  http://localhost:8080/pingapp.Get("/ping", func(ctx iris.Context) {ctx.WriteString("pong")})//  GET 方法 返回 JSON 格式的数据// 示例 URL : http://localhost:8080/helloapp.Get("/hello", func(ctx iris.Context) {ctx.JSON(iris.Map{"message": "Hello Iris!"})})// 启动// http://localhost:8080// http://localhost:8080/ping// http://localhost:8080/helloapp.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
}

上面演示了: GET 方法 返回一个 HTML,返回字符串,返回 JSON的情形。 代码很简单,一看就懂。

响应 HTTP 中的各种方法(method): Get, Post, Put, Patch, Delete 和 Options

func main() {// Creates an application with default middleware:// logger and recovery (crash-free) middleware.app := iris.Default()app.Get("/someGet", getting)app.Post("/somePost", posting)app.Put("/somePut", putting)app.Delete("/someDelete", deleting)app.Patch("/somePatch", patching)app.Head("/someHead", head)app.Options("/someOptions", options)app.Run(iris.Addr(":8080"))
}
从 请求 中获得参数的值

app.Get("/users/{id:uint64}", func(ctx iris.Context){id := ctx.Params().GetUint64Default("id", 0)// [...]
})
从查询字符串( QueryString )中获得值

查询字符串 QueryString,是网址中的 键值对的格式。 比如这样格式: /welcome?firstname=Jane&lastname=Doe.

app.Get("/welcome", func(ctx iris.Context) {// 下面这个是 ctx.Request().URL.Query().Get("lastname"). 的简单写法// 读取值lastname := ctx.URLParam("lastname") // ,读取值支持默认值的方式firstname := ctx.URLParamDefault("firstname", "Guest")})
从表单(Form) 中获得值

通过POST发来的请求中有 “表单(Form) 数据”, 这样来获取

app.Post("/form_post", func(ctx iris.Context) {message := ctx.FormValue("message")nick := ctx.FormValueDefault("nick", "anonymous")})
上传文件

设定 maxSize 控制 请求包的大小,和保存的文件名。

复制

const maxSize = 5 << 20 // 5MBfunc main() {app := iris.Default()app.Post("/upload", iris.LimitRequestBodySize(maxSize), func(ctx iris.Context) {// 这里指示了 网址,和  beforeSavectx.UploadFormFiles("./uploads", beforeSave)})app.Run(iris.Addr(":8080"))
}func beforeSave(ctx iris.Context, file *multipart.FileHeader) {ip := ctx.RemoteAddr()// 获取ip地址,转成字符串ip = strings.Replace(ip, ".", "_", -1)ip = strings.Replace(ip, ":", "_", -1)// 这里处理了文件名file.Filename = ip + "-" + file.Filename
}
支持对路由的分组

复制

  func main() {app := iris.Default()// Simple group: v1.v1 := app.Party("/v1"){v1.Post("/login", loginEndpoint)v1.Post("/submit", submitEndpoint)v1.Post("/read", readEndpoint)}// Simple group: v2.v2 := app.Party("/v2"){v2.Post("/login", loginEndpoint)v2.Post("/submit", submitEndpoint)v2.Post("/read", readEndpoint)}app.Run(iris.Addr(":8080"))} 
中间件

使用 app.Use() 函数来添加中间件

示例:

代码语言:javascript

复制

 app := iris.New()app.Use(recover.New())

日志中间件:

  requestLogger := logger.New(logger.Config{// Status displays status codeStatus: true,// IP displays request's remote addressIP: true,// Method displays the http methodMethod: true,// Path displays the request pathPath: true,// Query appends the url query to the Path.Query: true,// if !empty then its contents derives from `ctx.Values().Get("logger_message")// will be added to the logs.MessageContextKeys: []string{"logger_message"},// if !empty then its contents derives from `ctx.GetHeader("User-Agent")MessageHeaderKeys: []string{"User-Agent"},})app.Use(requestLogger)

为某个分组的 url 段添加中间件

// Authorization party /user.
// authorized := app.Party("/user", AuthRequired())
// exactly the same as:
authorized := app.Party("/user")
// per party middleware! in this case we use the custom created
// AuthRequired() middleware just in the "authorized" group/party.
authorized.Use(AuthRequired())
{authorized.Post("/login", loginEndpoint)authorized.Post("/submit", submitEndpoint)authorized.Post("/read", readEndpoint)// nested group: /user/testingtesting := authorized.Party("/testing")testing.Get("/analytics", analyticsEndpoint)
}
写入日志到文件中

先准备一个 file 流

// Get a filename based on the date, just for the sugar.
func todayFilename() string {today := time.Now().Format("Jan 02 2006")return today + ".txt"
}func newLogFile() *os.File {filename := todayFilename()// Open the file, this will append to the today's file if server restarted.f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil {panic(err)}return f
}

调用 app.Logger().SetOutput 指向这个文件

f := newLogFile()
defer f.Close()app := iris.New()
app.Logger().SetOutput(f)
Cookie 操作
    ctx.SetCookieKV(name, value)value := ctx.GetCookie(name)ctx.RemoveCookie(name)

示例:

 app.Get("/cookies/{name}/{value}", func(ctx iris.Context) {name := ctx.Params().Get("name")value := ctx.Params().Get("value")ctx.SetCookieKV(name, value)ctx.Writef("cookie added: %s = %s", name, value)})
处理跨域CORS

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。 出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头。

跨域资源共享( CORS )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 请求所带来的风险。

Iris 的一个社区框架可以帮助解决跨域问题,分几个步骤:

  • 配置 crs 对象的参数,AllowedOrigins 参数设定服务器地址
  • 为你的 Party 加入允许。方法: app.Party("/api/v1", crs).AllowMethods(iris.MethodOptions)

代码示例:

  package mainimport ("github.com/kataras/iris/v12""github.com/iris-contrib/middleware/cors")func main() {app := iris.New()crs := cors.New(cors.Options{AllowedOrigins:   []string{"*"}, // 这里写允许的服务器地址,* 号标识任意AllowCredentials: true,})v1 := app.Party("/api/v1", crs).AllowMethods(iris.MethodOptions) // <- important for the preflight.{v1.Get("/home", func(ctx iris.Context) {ctx.WriteString("Hello from /home")})v1.Get("/about", func(ctx iris.Context) {ctx.WriteString("Hello from /about")})v1.Post("/send", func(ctx iris.Context) {ctx.WriteString("sent")})v1.Put("/send", func(ctx iris.Context) {ctx.WriteString("updated")})v1.Delete("/send", func(ctx iris.Context) {ctx.WriteString("deleted")})}app.Run(iris.Addr("localhost:8080"))}

详细见:https://github.com/iris-contrib/middleware/tree/master/cors

了解更多

更多请参考官方文档:https://iris-go.com/

官方GIT地址: https://github.com/kataras/iris

相关文章:

Go web 开发框架 Iris

背景 掌握了 Go 语言的基础后就该开始实践了&#xff0c;编写Web应用首先需要一个 web 开发框架。做框架选型时&#xff0c;处理web请求是基本功能&#xff0c;至于MVC是更进一步需要。现在比较流行的web架构是前后端分离&#xff0c;后端响应RESTful的请求&#xff0c;Iris 能…...

uniapp Native.js 调用安卓arr原生service

最近搞了个uni小项目&#xff0c;一个定制的小平板&#xff0c;带一个nfc设备&#xff0c;厂家只给了一套安卓原生demo&#xff0c;头一次玩原生安卓&#xff0c;废了好半天劲打出来arr包&#xff0c;想镶进uniapp里&#xff0c;网上查了好久&#xff0c;都是错的&#xff0c;要…...

C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容

我们有一个中文录音文件.mp3格式或者是.wav格式&#xff0c;如果我们想要提取录音文件中的文字内容&#xff0c;我们可以采用以下方法&#xff0c;不需要使用Azure Speech API 密钥注册通过离线的方式实现。 1.首先我们先在NuGet中下载两个包 NAudio 2.2.1、Whisper.net 1.7.3…...

【一文了解】C#重点-委托1

本篇文章来学习一下C#的委托&#xff0c;委托是C#中的一个重要概念&#xff0c;它允许将方法作为参数传递给其他方法。C#中的委托类似于C或C中的函数指针&#xff0c;并且类型安全。 委托 1.委托的定义 委托&#xff08;delegate&#xff09;是方法的代理/代表&#xff0c;委托…...

WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)

文章目录 1、引言2、案例效果3、案例实现1、依赖安装2、文件创建3、代码实现1、依赖引用与上下文2、个性化视觉效果:自定义 ItemContainerStyle3、页面样式与布局完整代码4、ViewModel 逻辑实现5、子界面代码:3、实现效果4、源代码获取5、总结1、引言 在WPF应用程序开发中,…...

新版Android Studio 2024.1.2版本,如何通过无线wifi连接手机实现交互

1、首先&#xff0c;先确定手机是否启动了开发者选项 在我的设备 -> 全部参数 -> MIUI版本点击6下 &#xff08;有的手机是 关于手机 -> 查看手机版本 &#xff09; 2、在设置中搜索 开启开发者选项 3、进入开发者选项后&#xff0c;在 调试 中选择 无线调试并选择…...

VTK知识学习(26)- 图像基本操作(一)

1、前言 图像处理离不开一些基本的图像数据操作&#xff0c;例如获取和修改图像的基本信息、访问和修改图像像素值、图像显示、图像类型转换等。熟练掌握这些基本操作有助于使用 VTK进行图像处理应用程序的快速开发。 2、图像信息的访问与修改 1&#xff09;利用vtkIamgeData…...

2024年9月AI头条新闻:创新与挑战并存

2024年9月AI头条新闻&#xff1a;创新与挑战并存 9月&#xff0c;人工智能领域继续高速发展&#xff0c;重大产品发布、伦理争议和技术突破交织在一起。让我们回顾一下本月最重要的AI新闻&#xff1a; OpenAI的o1&#xff1a;更强大的语言模型 OpenAI推出了o1&#xff0c;一个…...

[Xshell] Xshell的下载安装使用、连接linux、 上传文件到linux系统-详解(附下载链接)

前言 xshell 链接&#xff1a;https://pan.quark.cn/s/57062561e81a 提取码&#xff1a;TK4K 链接失效&#xff08;可能被官方和谐&#xff09;可评论或私信我重发 安装 下载后解压得到文件 安装路径不要有中文 打开文件 注意&#xff01;360等软件会拦截创建注册表的行为&a…...

count(1)、count(_)与count(列名)的区别?

大家好&#xff0c;我是锋哥。今天分享关于【count(1)、count(_)与count(列名)的区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; count(1)、count(_)与count(列名)的区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 中&#xff0c…...

代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

贪心没有套路&#xff0c;说白了就是常识性推导加上举反例 今天的内容比较简单 简单了解贪心是通过局部最优解反推全局最优解&#xff08;有经验成分&#xff09; 455.分发饼干 题目链接&#xff1a;455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 讲解链接&#xff…...

List直接使用removeAll报错

List直接使用removeAll报错 需要先将list转换才能使用 原因是&#xff1a; removeAll 方法在 Java 中用于从当前列表中删除另一个列表中存在的所有元素。如果直接对 List 接口的一个实现使用 removeAll 方法抛出异常&#xff0c;可能的原因有&#xff1a; 不同的List实现&am…...

Debian环境安装Docker Engine

Debian环境安装Docker Engine 卸载旧版本使用APT工具安装Docker设置存储库安装Docker设置权限 docker compose命令卸载Docker 卸载旧版本 要卸载的非官方软件包是&#xff1a; docker.iodocker-composedocker-docpodman-docker 此外&#xff0c;Docker Engine 依赖 containe…...

Python常用内置函数总结

目录 1. abs() 2. complex() 3. divmod() 4. eval() 5. float() 6. hash() 7. input() 8. int() 9. len() 10. list() 11. oct() 12. open() 13. pow() 14. print() 15. range() 16. reversed() 17. round() 18. sorted()…...

深入了解蓝牙Profile类型与设备的对应关系

在现代技术中,蓝牙作为一种无线通信技术,广泛应用于各种设备之间的短距离通信。不同的设备在连接时使用不同的蓝牙Profile(配置文件),每种Profile都为特定的设备功能提供支持,例如音频流传输、语音通话、文件传输等。在本文中,我们将详细介绍蓝牙Profile的常见类型及其对…...

[bug]java导出csv用Microsoft Office Excel打开乱码解决

[bug]java导出csv用Microsoft Office Excel打开乱码 ‍ 现象 首先这个csv文件用macbook自带的 "Numbers表格" 软件打开是不乱码的, 但是使用者是Windows系统,他的电脑没有"Numbers表格"工具, ​​ 他用Microsoft Office Excel打开之后出现乱码,如下图…...

2023年区块链职业技能大赛——区块链应用技术(一)模块一

模块一:区块链产品方案设计及系统运维: 任务1-1:区块链产品需求分析与方案设计 1.依据给定区块链食品溯源系统的业务架构图&#xff0c;对考题进行业务分析&#xff0c;可能多的去考虑一个业务系统所需要的模块&#xff0c;使用Visio或思维导图工具展现本系统的基本设计概念和…...

4 软件工程——总体设计

一、设计过程 1.两个主要阶段 系统设计阶段&#xff1a;确定系统的具体实现方案结构设计阶段&#xff1a;确定软件结构 2.九个步骤 设想供选择的方案选取合理的方案推荐最佳方案功能分解设计软件结构设计数据库制定测试计划书写文档审查和复审 二、设计原理 1.模块化 模块…...

Elasticsearch:确保业务规则与语义搜索无缝协作

作者&#xff1a;来自 Elastic Kathleen DeRusso 利用查询规则与语义搜索和重新排序相结合的强大功能。 更多阅读&#xff1a; Elasticsearch 8.10 中引入查询规则 - query rules Elasticsearch 查询规则现已正式发布 - query rules 你是否知道查询规则&#xff08;query ru…...

【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧

【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱&#xff1a;通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧 目录 文章目录 【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱&#xff1a;通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧目…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...