类型安全的 Go HTTP 请求
前言
对 Gopher 来说,虽然我们基本都是在写代码让别人来请求,但是有时候,我们也需要去请求第三方提供的 RESTful 接口,这个时候,我们才能感受到前端同学拼接 HTTP 请求参数的痛苦。
比如,我们要发起类似这样一个请求,看起来很简单,实际写起来还是比较繁琐的。
POST /articles/5/update?device=ios HTTP/1.1 Host: go-zero.dev Authorization: Bearer <jwt-token> {"author":"kevin","body":"this is not important!","title":"my title","type":6}
Go 原生写法
这个 API 其实是蛮简单的,我们直接上手就可以写出来。
func main() { var buf bytes.Buffer encoder := json.NewEncoder(&buf) params := map[string]interface{}{ "title": "my title", "body": "this is not important!", "author": "kevin", "type": 6, } if err := encoder.Encode(params); err != nil { fmt.Fprintln(os.Stderr, err) return } url := fmt.Sprintf("http://localhost:3333/articles/%d/update?device=%s", 5, "ios") req, err := http.NewRequest(http.MethodPost, url, &buf) if err != nil { fmt.Fprintln(os.Stderr, err) return } req.Header.Add("Authorization", "Bearer <jwt-token>") cli := http.Client{} resp, err := cli.Do(req) if err != nil { fmt.Fprintln(os.Stderr, err) return } io.Copy(os.Stdout, resp.Body) }
我们跑了测试一下,发现没有得到 200 OK
,抓包看一下,请求如下。各位不要往下看,你能想到失败的原因吗?
POST /articles/5/update?device=ios HTTP/1.1 Host: go-zero.dev User-Agent: Go-http-client/1.1 Content-Length: 79 Authorization: Bearer <jwt-token> Accept-Encoding: gzip {"author":"kevin","body":"this is not important!","title":"my title","type":6}
具体失败原因这里就不细讲了,我们先来分析这段代码。可以看到其中为了拼接参数使用了 map[string]interface{}
,对于其中每个字段我们是不能校验类型是否匹配的,只有发送出去了,收到了服务端的 200 OK
,我们才能确认传对了。比如其中的 type
参数,这里是使用了 int
类型,我们可能顺手写成 string
类型,但是不请求我们还是很难发现这个参数写错了的。
那么让我们看看 go-zero
里 httpc
包是怎么使用并保证类型安全的。
httpc
实现
我们看看用 httpc
包来请求的代码怎么写。
const url = "http://go-zero.dev/articles/:id/update" type UpdateArticle struct { ID int `path:"id"` Device string `form:"device,options=ios,android,web,desktop"` Authorization string `header:"Authorization"` Title string `json:"title"` Body string `json:"body"` Author string `json:"author"` Type int `json:"type"` } func main() { data := &UpdateArticle{ ID: 5, Device: "ios", Authorization: "Bearer <jwt-token>", Title: "my title", Body: "this is not important!", Author: "kevin", Type: 6, } resp, err := httpc.Do(context.Background(), http.MethodPost, url, data) if err != nil { fmt.Fprintln(os.Stderr, err) return } io.Copy(os.Stdout, resp.Body) }
写完测试一下,结果正如预期:
POST /articles/5/update?device=ios HTTP/1.1 Host: go-zero.dev User-Agent: Go-http-client/1.1 Content-Length: 79 Content-Type: application/json; charset=utf-8 Authorization: Bearer <jwt-token> Accept-Encoding: gzip {"author":"kevin","body":"this is not important!","title":"my title","type":6}
你发现了没有,跟前面的对比,其中多了 Content-Type: application/json; charset=utf-8
,而我们之前写法里忘记设置 Content-Type
了。
而 httpc
的写法只要定义好请求的类型,然后通过 httpc.Do
就可以做到类型安全,并且代码非常精简。支持了如我们代码所示的 path
、form
、header
和 json
,可以非常方便且类型安全的发送 HTTP
请求。
更多能力
除了上面展示的简单易用和类型安全以外,httpc
包还有以下特点:
context
的超时控制OpenTelemetry
自动集成,服务端返回的trace-id
,span-id
都会自动被记录到日志里,便于后续客户端、服务端协同查问题- 可以通过
httpc.Service
来获得熔断能力,当服务端有问题,会自动熔断隔离请求,避免浪费时间等待和加剧服务端压力
项目地址
https://github.com/zeromicro/go-zero
https://gitee.com/kevwan/go-zero
欢迎使用 go-zero
并 star 支持我们!
微信交流群
关注『微服务实践』公众号并点击 交流群 获取社区群二维码。</jwt-token></jwt-token></jwt-token></jwt-token></jwt-token>

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
千亿级高并发MongoDB集群在某头部金融系统中的应用及性能优化实践(上)
某头部金融系统采用MongoDB存储重要的金融数据,数据量较大,数据规模约2000亿左右,读写流量较高,峰值突破百万级/每秒。本文分享该千亿级高并发MongoDB集群的踩坑及性能优化实践,通过本文可以了解如下信息: 如何对海量MongoDB集群进行性能瓶颈定位 千亿规模集群常用踩坑点 如何对高并发大数据量MongoDB集群进行性能优化 集群监控信息缺失,如何分析集群抖动问题 如何像原厂工程师一样借助diagnose.data(not human-readable)分析内核问题 第一章:业务背景及MongoDB FTDC诊断介绍 业务背景 该MongoDB集群采用多分片架构部署,业务不定期长时间高并发读写,该集群业务背景总结如下: 数据量大,该集群总数据量突破千亿规模 集群最大表总chunks数约500万 长时间高并发读写 一致性要求较高,读写全走主节点 高峰期持续性读写qps百万/秒 单分片峰值流量接近20万/秒 内核版本3.6.3版本 非云上集群 除了节点日志,监控数据缺失,无MongoDB常用监控指标信息 随着时间推移,集群数据规模超过千亿,集群遇到了一些疑难问题,如主从切...
- 下一篇
novel v3.0.0 发布,Spring Boot 3 + Vue 3 学习型项目
novel v3.0.0发布,主要改变如下: [命名]小说精品屋(原名 fiction_house )更名为 novel [定位]产品方向调整为学习型 JAVA 项目 [架构]遵循阿里巴巴最新开发规范(嵩山版),数据库重新设计,项目结构调整 [技术]使用当前最新技术栈 Spring Boot 3 + Vue 3 开发,项目驱动式学习,并定期升级 [功能]上线 novel 后端项目和 novel-front-web 前端项目 [文档]上线项目实战教程 -手把手教你从零开始开发上线一个生产级别的小说系统 演示站点 点击前往 软件简介 novel 是一套基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离学习型小说项目,配备详细的项目教程手把手教你从零开始开发上线一个生产级别的 Java 系统。由小说门户系统、作家后台管理系统、平台后台管理系统等多个子系统构成。包括小说推荐、作品检索、小说排行榜、小说阅读、小说评论、会员中心、作家专区、充值订阅、新闻发布等功能。 开发环境 MySQL 8.0 Redis 7.0 JDK 17 Maven 3.8 Nod...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Mario游戏-低调大师作品
- 设置Eclipse缩进为4个空格,增强代码规范