Go类型安全的HTTP请求示例详解_第1页
Go类型安全的HTTP请求示例详解_第2页
Go类型安全的HTTP请求示例详解_第3页
Go类型安全的HTTP请求示例详解_第4页
Go类型安全的HTTP请求示例详解_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论