Go类型安全的HTTP请求示例详解
来源:脚本之家
时间:2023-01-07 12:03:27 122浏览 收藏
怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Go类型安全的HTTP请求示例详解》,涉及到请求、HTTP、类型安全,有需要的可以收藏一下
比如,我们要发起类似这样一个请求,看起来很简单,实际写起来还是比较繁琐的。
POST /articles/5/update?device=ios HTTP/1.1 Host: go-zero.dev Authorization: Bearer{"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") 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: BearerAccept-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", 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: BearerAccept-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 来获得熔断能力,当服务端有问题,会自动熔断隔离请求,避免浪费时间等待和加剧服务端压力
理论要掌握,实操不能落!以上关于《Go类型安全的HTTP请求示例详解》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
-
387 收藏
-
329 收藏
-
447 收藏
-
101 收藏
-
343 收藏
-
165 收藏
-
473 收藏
-
377 收藏
-
384 收藏
-
246 收藏
-
110 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习