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 语言的基础后就该开始实践了,编写Web应用首先需要一个 web 开发框架。做框架选型时,处理web请求是基本功能,至于MVC是更进一步需要。现在比较流行的web架构是前后端分离,后端响应RESTful的请求,Iris 能…...
uniapp Native.js 调用安卓arr原生service
最近搞了个uni小项目,一个定制的小平板,带一个nfc设备,厂家只给了一套安卓原生demo,头一次玩原生安卓,废了好半天劲打出来arr包,想镶进uniapp里,网上查了好久,都是错的,要…...
C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容
我们有一个中文录音文件.mp3格式或者是.wav格式,如果我们想要提取录音文件中的文字内容,我们可以采用以下方法,不需要使用Azure Speech API 密钥注册通过离线的方式实现。 1.首先我们先在NuGet中下载两个包 NAudio 2.2.1、Whisper.net 1.7.3…...
【一文了解】C#重点-委托1
本篇文章来学习一下C#的委托,委托是C#中的一个重要概念,它允许将方法作为参数传递给其他方法。C#中的委托类似于C或C中的函数指针,并且类型安全。 委托 1.委托的定义 委托(delegate)是方法的代理/代表,委托…...
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、首先,先确定手机是否启动了开发者选项 在我的设备 -> 全部参数 -> MIUI版本点击6下 (有的手机是 关于手机 -> 查看手机版本 ) 2、在设置中搜索 开启开发者选项 3、进入开发者选项后,在 调试 中选择 无线调试并选择…...
VTK知识学习(26)- 图像基本操作(一)
1、前言 图像处理离不开一些基本的图像数据操作,例如获取和修改图像的基本信息、访问和修改图像像素值、图像显示、图像类型转换等。熟练掌握这些基本操作有助于使用 VTK进行图像处理应用程序的快速开发。 2、图像信息的访问与修改 1)利用vtkIamgeData…...
2024年9月AI头条新闻:创新与挑战并存
2024年9月AI头条新闻:创新与挑战并存 9月,人工智能领域继续高速发展,重大产品发布、伦理争议和技术突破交织在一起。让我们回顾一下本月最重要的AI新闻: OpenAI的o1:更强大的语言模型 OpenAI推出了o1,一个…...
[Xshell] Xshell的下载安装使用、连接linux、 上传文件到linux系统-详解(附下载链接)
前言 xshell 链接:https://pan.quark.cn/s/57062561e81a 提取码:TK4K 链接失效(可能被官方和谐)可评论或私信我重发 安装 下载后解压得到文件 安装路径不要有中文 打开文件 注意!360等软件会拦截创建注册表的行为&a…...
count(1)、count(_)与count(列名)的区别?
大家好,我是锋哥。今天分享关于【count(1)、count(_)与count(列名)的区别?】面试题。希望对大家有帮助; count(1)、count(_)与count(列名)的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 中,…...
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
贪心没有套路,说白了就是常识性推导加上举反例 今天的内容比较简单 简单了解贪心是通过局部最优解反推全局最优解(有经验成分) 455.分发饼干 题目链接:455. 分发饼干 - 力扣(LeetCode) 讲解链接ÿ…...
List直接使用removeAll报错
List直接使用removeAll报错 需要先将list转换才能使用 原因是: removeAll 方法在 Java 中用于从当前列表中删除另一个列表中存在的所有元素。如果直接对 List 接口的一个实现使用 removeAll 方法抛出异常,可能的原因有: 不同的List实现&am…...
Debian环境安装Docker Engine
Debian环境安装Docker Engine 卸载旧版本使用APT工具安装Docker设置存储库安装Docker设置权限 docker compose命令卸载Docker 卸载旧版本 要卸载的非官方软件包是: docker.iodocker-composedocker-docpodman-docker 此外,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.依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和…...
4 软件工程——总体设计
一、设计过程 1.两个主要阶段 系统设计阶段:确定系统的具体实现方案结构设计阶段:确定软件结构 2.九个步骤 设想供选择的方案选取合理的方案推荐最佳方案功能分解设计软件结构设计数据库制定测试计划书写文档审查和复审 二、设计原理 1.模块化 模块…...
Elasticsearch:确保业务规则与语义搜索无缝协作
作者:来自 Elastic Kathleen DeRusso 利用查询规则与语义搜索和重新排序相结合的强大功能。 更多阅读: Elasticsearch 8.10 中引入查询规则 - query rules Elasticsearch 查询规则现已正式发布 - query rules 你是否知道查询规则(query ru…...
【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧
【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧 目录 文章目录 【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧目…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
