Resty
resty 是 Go 里常用的 HTTP 客户端库,基于标准库 net/http 封装,主要解决原生 HTTP 请求代码偏繁琐的问题。
适合用于:
- 调用第三方 API
- 调用公司内部服务
- 发送 GET / POST / PUT / DELETE 请求
- 处理 JSON 请求体和响应体
- 设置 Header、Query、Cookie、Timeout、Retry 等
GitHub:
安装:
基础用法
创建 client:
发送 GET 请求:
GET 带 Query 参数
多个 query 参数也可以这样写:
POST JSON
SetBody 可以直接传 struct,resty 会自动转成 JSON。
解析 JSON 响应
SetResult(&result) 会把成功响应自动反序列化到结构体里。
设置 Header
也可以给 client 设置公共 Header:
后续这个 client 发出的请求都会带上这些 Header。
错误处理
常用判断:
设置重试
适合处理网络抖动、临时超时等场景。
推荐封装方式
业务项目里不要到处直接写 resty.New(),可以封装一个 client:
简单结论
resty 的优点是代码少、链式调用直观、JSON 处理方便,适合业务项目里调用 HTTP API。
如果是 SDK 或基础库,可以考虑原生 net/http;如果是普通业务系统,resty 通常心智负担更低。
错误抓取
err 和 resp.IsError() 判断的是两层不同的错误。
err 主要表示:请求有没有成功发出去、有没有拿到 HTTP 响应。
比如这些情况会进 err:
示例:
但如果服务端正常返回了 HTTP 响应,即使状态码是 400、401、500,通常 err 也是 nil。
比如服务端返回:
这时请求本身是成功完成的,所以:
所以 resp.IsError() 是用来判断:HTTP 状态码是不是业务上失败了。
简单理解:
常见流程:
举例:
所以两个都要判断。err 只能说明“HTTP 请求过程是否成功”,不能说明“接口业务是否成功”。