GET请求用context.URLParam取查询参数、context.Params().Get取路径参数;POST需按Content-Type选用ReadForm、ReadJSON或手动读Body,且必须校验错误,否则易得空值。

直接用 app.Get 和 app.Post 就能跑通最基础的路由,但参数获取方式、上下文类型、错误处理逻辑稍有差异,不注意容易返回空值或 panic。
GET 请求:URL 参数和路径参数怎么取?
GET 请求的数据通常在 URL 查询字符串里(如 /user?id=123&name=john),Iris 提供两种常用取法:
-
context.URLParam("key")用于读取查询参数(?key=value),未传时返回空字符串 -
context.Params().Get("key")用于读取动态路由参数(如app.Get("/user/{id:uint}", ...)中的id),未匹配则 panic,建议配合context.Params().Exists("key")判断 - 如果同时用了查询参数和路径参数(比如
/user/123?format=json),两个方法要分开调,不能混用
示例:
app.Get("/user/{id:uint}", func(ctx iris.Context) {
id := ctx.Params().Get("id") // 动态路径参数
format := ctx.URLParam("format") // 查询参数
ctx.JSON(iris.Map{"id": id, "format": format})
})
POST 请求:表单、JSON、原始 body 怎么区分读?
POST 的数据来源不同,读取方式必须对应,否则 ReadForm 会忽略 JSON,ReadJSON 会解析失败:
- HTML 表单(
application/x-www-form-urlencoded)→ 用ctx.ReadForm(&struct{}) - 前端发的 JSON(
application/json)→ 用ctx.ReadJSON(&struct{}),结构体字段需带json:tag - 需要原始字节(如上传文件、二进制流)→ 用
ctx.Request().Body手动读,但注意只能读一次,且需提前检查Content-Length
常见错误:没设请求头 Content-Type 就调 ReadJSON,结果 struct 字段全零值,日志也无报错 —— Iris 默认静默失败,建议加 error 判断:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
var u UserInfo
if err := ctx.ReadJSON(&u); err != nil {
ctx.StatusCode(400)
ctx.WriteString("invalid json: " + err.Error())
return
}
app.Handle 和 app.Get/app.Post 有什么实际区别?
本质都是注册 handler,但封装程度和可读性不同:
-
app.Get("/path", h)是语法糖,等价于app.Handle("GET", "/path", h),语义清晰、IDE 自动补全友好 -
app.Handle必须显式传入方法名字符串,适合写通用中间件或动态注册(比如从配置加载路由),但拼错方法名(如"get"小写)会导致路由完全不生效,且无编译提示 - 所有 HTTP 方法(
PUT、PATCH、OPTIONS等)都支持同名封装方法,没必要硬套Handle
注意:app.Any("/path", h) 会响应所有方法,调试时方便,上线前务必确认是否真要放行所有方法。
为什么有时候 POST 路由收不到数据,但 GET 没问题?
多数是客户端和服务端的 Content-Type 不一致导致的隐性失败:
- 前端用
fetch发 JSON 却没设headers: {'Content-Type': 'application/json'}→ Iris 不识别,ReadJSON返回 nil error 但 struct 为空 - 后端用了
ctx.ReadForm去读 JSON 数据 → 字段永远为零值,因为 form 解析器只认&分隔的键值对 - Iris 默认不校验
Content-Type,也不会自动 fallback,它严格按你调用的方法去解析
最稳妥的做法:在 handler 开头打日志,输出 ctx.GetHeader("Content-Type") 和 ctx.Request().ContentLength,比盲猜快得多。


















