gin两行代码即可启动天气查询服务:r := gin.default() 和 r.get("/weather", func(c *gin.context) { city := c.query("city"); c.json(200, gin.h{"city": city, "weather": "sunny"}) }),使用c.query("city")获取url参数,c.json显式返回响应。

如何用Gin快速启动一个天气查询HTTP服务
直接起一个能响应 /weather?city=beijing 的API,不需要中间件、不用数据库,Gin两行代码就能跑起来。关键不是“怎么写框架”,而是别在路由绑定和参数解析上卡住。
-
gin.Default()就够用,它自带日志和恢复中间件,开发阶段别自己写gin.New()+ 手动加中间件 - 用
c.Query("city")拿查询参数,不是c.Param("city")(那是路径参数,比如/weather/:city) - 记得在 handler 里显式调用
c.JSON(200, data),Gin 不会自动序列化返回值
Gin中解析请求参数的三种常见写法及适用场景
天气API最常遇到的是城市名、坐标、时间范围这些输入,选错解析方式会导致 400 Bad Request 或取不到值。
- URL 查询参数(如
?city=shanghai&lang=zh)→ 用c.Query("city")或c.GetQuery("city")(后者带 bool 返回值,推荐) - JSON Body(如 POST
{"city": "guangzhou", "days": 7})→ 先定义 struct,再用c.ShouldBindJSON(&req),注意字段必须是导出的(首字母大写),且加json:tag - 表单数据(
application/x-www-form-urlencoded)→ 用c.ShouldBind(&req),它会自动判断 Content-Type 并选择解析方式
调用第三方天气API时的超时与错误处理怎么做
别让外部接口拖垮你的服务——Gin本身不处理HTTP出站请求,但你得在 handler 里控制好 http.Client 行为。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 必须设置
http.Client.Timeout,建议 5 秒以内,否则用户等不到响应就断连了 - 检查
resp.StatusCode,很多天气API失败时返回 200 + 错误 body(比如高德返回{"status":"invalid_key"}),不能只看 err 是否为 nil - 别把原始第三方响应直接透传给前端,先解码、校验字段是否存在(比如
result.location.name),缺失时返回明确错误,例如c.JSON(502, gin.H{"error": "weather service unavailable"})
为什么Gin的JSON序列化有时丢失字段或变成null
结构体字段没出现在响应里,90% 是因为字段未导出或 JSON tag 写错了,不是 Gin 问题。
- Go 中只有首字母大写的字段才能被外部包访问,
type Weather struct { city string }的city永远不会出现在 JSON 里 - 正确写法:
City string `json:"city"`,注意双引号和小写 key;如果想忽略空值,加omitempty:Temp float64 `json:"temp,omitempty"` - 如果第三方API返回的是数字字符串(如
"12.5"),而你定义成int字段,json.Unmarshal会静默失败并设为零值,建议统一用float64或自定义 UnmarshalJSON 方法
真正麻烦的不是写接口,而是第三方天气API的字段命名不一致、单位不统一、偶尔返回空数组——这些没法靠框架解决,得在业务层做适配和兜底。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










