




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Go类型安全的HTTP请求示例详解目录前言Go原生写法httpc实现更多能力
前言
对Gopher来说,虽然我们基本都是在写代码让别人来请求,但是有时候,我们也需要去请求第三方提供的RESTful接口,这个时候,我们才能感受到前端同学拼接HTTP请求参数的痛苦。
比如,我们要发起类似这样一个请求,看起来很简单,实际写起来还是比较繁琐的。
POST/articles/5/updatedevice=iosHTTP/1.1
Host:go-zero.dev
Authorization:Bearerjwt-token
{"author":"kevin","body":"thisisnotimportant!","title":"mytitle","type":6}
Go原生写法
这个API其实是蛮简单的,我们直接上手就可以写出来。
funcmain(){
varbufbytes.Buffer
encoder:=json.NewEncoder(buf)
params:=map[string]interface{}{
"title":"mytitle",
"body":"thisisnotimportant!",
"author":"kevin",
"type":6,
iferr:=encoder.Encode(params);err!=nil{
fmt.Fprintln(os.Stderr,err)
return
url:=fmt.Sprintf("http://localhost:3333/articles/%d/updatedevice=%s",5,"ios")
req,err:=http.NewRequest(http.MethodPost,url,buf)
iferr!=nil{
fmt.Fprintln(os.Stderr,err)
return
req.Header.Add("Authorization","Bearerjwt-token")
cli:=http.Client{}
resp,err:=cli.Do(req)
iferr!=nil{
fmt.Fprintln(os.Stderr,err)
return
io.Copy(os.Stdout,resp.Body)
我们跑了测试一下,发现没有得到200OK,抓包看一下,请求如下。各位不要往下看,你能想到失败的原因吗?
POST/articles/5/updatedevice=iosHTTP/1.1
Host:go-zero.dev
User-Agent:Go-http-client/1.1
Content-Length:79
Authorization:Bearerjwt-token
Accept-Encoding:gzip
{"author":"kevin","body":"thisisnotimportant!","title":"mytitle","type":6}
具体失败原因这里就不细讲了,我们先来分析这段代码。可以看到其中为了拼接参数使用了map[string]interface{},对于其中每个字段我们是不能校验类型是否匹配的,只有发送出去了,收到了服务端的200OK,我们才能确认传对了。比如其中的type参数,这里是使用了int类型,我们可能顺手写成string类型,但是不请求我们还是很难发现这个参数写错了的。
那么让我们看看go-zero里httpc包是怎么使用并保证类型安全的。
httpc实现
我们看看用httpc包来请求的代码怎么写。
consturl="http://go-zero.dev/articles/:id/update"
typeUpdateArticlestruct{
IDint`path:"id"`
Devicestring`form:"device,options=ios,android,web,desktop"`
Authorizationstring`header:"Authorization"`
Titlestring`json:"title"`
Bodystring`json:"body"`
Authorstring`json:"author"`
Typeint`json:"type"`
funcmain(){
data:=UpdateArticle{
ID:5,
Device:"ios",
Authorization:"Bearerjwt-token",
Title:"mytitle",
Body:"thisisnotimportant!",
Author:"kevin",
Type:6,
resp,err:=httpc.Do(context.Background(),http.MethodPost,url,data)
iferr!=nil{
fmt.Fprintln(os.Stderr,err)
return
io.Copy(os.Stdout,resp.Body)
写完测试一下,结果正如预期:
POST/articles/5/updatedevice=iosHTTP/1.1
Host:go-zero.dev
User-Agent:Go-http-client/1.1
Content-Length:79
Content-Type:application/json;charset=utf-8
Authorization:Bearerjwt-token
Accept-Encoding:gzip
{"author":"kevin","body":"thisisnotimportant!","title":"mytitle","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都会自动被记录到日志
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甘肃省靖远县部分学校2024-2025学年高一下学期期中考试政治试题(原卷版+解析版)
- 高端生活广场商户租赁协议
- 设计实践对国际商业美术设计师考试的影响与试题及答案
- 纺织行业发展趋势与试题及答案探讨
- 2025广东汕尾市水务集团有限公司招聘人员8人笔试参考题库附带答案详解
- 2025宁夏银川高新区建设投资有限公司招聘10人笔试参考题库附带答案详解
- 推动教育高质量发展的路径与措施
- 老旧农机更新换代新政解读
- 低空经济助力应急救援体系现代化建设方案
- 施工合同合同协议书
- 《唐诗中的春夏秋冬》五年级下册诗词鉴赏一等奖课件
- 25题内控合规岗位常见面试问题含HR问题考察点及参考回答
- 智能水务一体化管理系统项目售后服务与培训方案
- 专业合作社财务报表EXCEL三表
- 车辆租赁合同(无中介-非租车公司)(标准版)
- 物业业主见面会方案
- 油气集输管线工程施工组织设计方案
- 北京市初中学业水平考试体育与健康知识模拟练习题(含答案)
- 韩国语topik单词-初级+中级
- 管式加热炉烟气低温露点腐蚀
- 非营利组织会计民间非营利组织会计
评论
0/150
提交评论