- Created by 郭强, last modified on Oct 08, 2023
基本介绍
GoFrame
框架提供了强大便捷易用的HTTP
客户端,由gclient
组件实现,对象创建可以通过gclient.New()
包方法,也可以通过g.Client()
方法调用。推荐使用g.Client()
来便捷地创建HTTP
客户端对象。由于gclient.Client
内部封装扩展于标准库的http.Client
对象,因此标准库http.Client
有的特性,gclient.Client
也是支持的。
方法列表: https://pkg.go.dev/github.com/gogf/gf/v2/net/gclient
简要说明:
- 我们可以使用
New
创建一个自定义的HTTP客户端对象Client
,随后可以使用该对象执行请求,该对象底层使用了连接池设计,因此没有Close
关闭方法。HTTP
客户端对象也可以通过g.Client()
快捷方法创建。 - 客户端提供了一系列以
HTTP Method
命名的方法,调用这些方法将会发起对应的HTTP Method
请求。常用的方法是Get
和Post
方法,同时DoRequest
是核心的请求方法,用户可以调用该方法实现自定义的HTTP Method
发送请求。 - 请求返回结果为
*ClientResponse
对象,可以通过该结果对象获取对应的返回结果,通过ReadAll
/ReadAllString
方法可以获得返回的内容,该对象在使用完毕后需要通过Close
方法关闭,防止内存溢出。 *Bytes
方法用于获得服务端返回的二进制数据,如果请求失败返回nil
;*Content
方法用于请求获得字符串结果数据,如果请求失败返回空字符串;Set*
方法用于Client
的参数设置。*Var
方法直接请求并获取HTTP接口结果为泛型类型便于转换。如果请求失败或者请求结果为空,会返回一个空的g.Var
泛型对象,不影响转换方法调用。- 可以看到,客户端的请求参数的数据参数
data
数据类型为interface{}
类型,也就是说可以传递任意的数据类型,常见的参数数据类型为string
/map
,如果参数为map
类型,参数值将会被自动urlencode
编码。
请使用给定的方法创建Client
对象,而不要使用new(ghttp.Client)
或者&ghttp.Client{}
创建客户端对象,否则,哼哼。
链式操作
GoFrame
框架的客户端支持便捷的链式操作,常用方法如下(文档方法列表可能滞后于源码,建议查看接口文档或源码 https://pkg.go.dev/github.com/gogf/gf/v2/net/gclient):
func (c *Client) Timeout(t time.Duration) *Client func (c *Client) Cookie(m map[string]string) *Client func (c *Client) Header(m map[string]string) *Client func (c *Client) HeaderRaw(headers string) *Client func (c *Client) ContentType(contentType string) *Client func (c *Client) ContentJson() *Client func (c *Client) ContentXml() *Client func (c *Client) BasicAuth(user, pass string) *Client func (c *Client) Retry(retryCount int, retryInterval time.Duration) *Client func (c *Client) Prefix(prefix string) *Client func (c *Client) Proxy(proxyURL string) *Client func (c *Client) RedirectLimit(redirectLimit int) *Client func (c *Client) Dump(dump ...bool) *Client func (c *Client) Use(handlers ...HandlerFunc) *Client
简要说明:
Timeout
方法用于设置当前请求超时时间。Cookie
方法用于设置当前请求的自定义Cookie
信息。Header*
方法用于设置当前请求的自定义Header
信息。Content*
方法用于设置当前请求的Content-Type
信息,并且支持根据该信息自动检查提交参数并自动编码。BasicAuth
方法用于设置HTTP Basic Auth
校验信息。Retry
方法用于设置请求失败时重连次数和重连间隔。Proxy
方法用于设置http访问代理。RedirectLimit
方法用于限制重定向跳转次数。
返回对象
gclient.Response
为HTTP对应请求的返回结果对象,该对象继承于http.Response
,可以使用http.Response
的所有方法。在此基础之上增加了以下几个方法:
func (r *Response) GetCookie(key string) string func (r *Response) GetCookieMap() map[string]string func (r *Response) Raw() string func (r *Response) RawDump() func (r *Response) RawRequest() string func (r *Response) RawResponse() string func (r *Response) ReadAll() []byte func (r *Response) ReadAllString() string func (r *Response) Close() error
这里也要提醒的是,Response
需要手动调用Close
方法关闭,也就是说,不管你使用不使用返回的Response
对象,你都需要将该返回对象赋值给一个变量,并且手动调用其Close
方法进行关闭(往往使用defer r.Close()
),否则会造成文件句柄溢出、内存溢出。
重要说明
ghttp
客户端默认关闭了KeepAlive
功能以及对服务端TLS
证书的校验功能,如果需要启用可自定义客户端的Transport
属性。- 连接池参数设定、连接代理设置等这些高级功能也可以通过自定义客户端的
Transport
属性实现,该数据继承于标准库的http.Transport
对象。
相关文档
- HTTPClient-基本使用
- HTTPClient-文件上传
- HTTPClient-自定义Cookie
- HTTPClient-自定义Header
- HTTPClient-自定义ContentType
- HTTPClient-自定义Transport
- HTTPClient-请求信息打印
- HTTPClient-代理Proxy设置
- HTTPClient-拦截器/中间件
- HTTPClient-常见问题
- HTTPClient-监控指标
Content Menu
- No labels
23 Comments
糖水不加糖
感觉Close可以由扩展自己完成.在请求完成后将header与body等信息直接读出来写入到一个struct中返回并直接Close. defer r.Close在业务上往往是重复性的操作.
郭强
有自动关闭的一些请求方法,具体请参考后续章节:HTTPClient-基本使用
糖水不加糖
这章我看过,主要是header与body同时返回.*Bytes/*Content/*Var它们都是获取单一对象(header/body中一个).
雷辉
文档说 g.Client() 是单例对象 但是无论从源码看 还是从调试现象(boot中设置超时和Transport未生效)来看,这个都是不是单例对象啊。版本是v1.15.4。源码中最终调用了 /net/ghttp/internal/client 的New方法,这个方法也不是单例方法啊。
郭强
没说
g.Client
是单例啊:对象管理雷辉
HTTPClient 大佬 这里写的
雷辉
GF框架提供了强大便捷易用的HTTP客户端,由ghttp.Client对象封装实现,对象创建可以通过ghttp.NewClient()包方法,也可以通过g.Client()单例对象调用。推荐使用g.Client()单例对象使用HTTP客户端功能特性。
我们可以使用NewClient创建一个自定义的HTTP客户端对象Client,随后可以使用该对象执行请求,该对象底层使用了连接池设计,因此没有Close关闭方法。HTTP客户端对象也可以通过g.Client()快捷方法创建,该方式创建的客户端对象为单例对象。
郭强
嗯,写错了,我改正了。
雷辉
这个有计划写成单例吗 接收PR否?
雷辉
简要说明的第一条没改。。
Jansen
请问HTTPClient支持异步吗?
Kevin.Z
郭强 强哥,需要使用到“httputil.ReverseProxy“,但是没法直接塞ctx进去,无法全链路跟踪,有计划支持反向代理吗?
Kevin.Z
ghttp.Request 和 http.Request 不能通用,提示:http: proxy error: unsupported protocol scheme ""
郭强
不会吧,可以将代码提issue
zhengjianyang
Client不能设置Jar吗或者Client怎么记录Cookie,resp中有setCookies在Client.Jar中还是空的
yidashi
今天才发现,这个g.client不能请求本地回环地址,给我来个"service not found with name \"127.0.0.1:8080\"",这个地址绝对能访问
yidashi
之前我就发现不对劲了,今天发现一个url也不能访问,返回跟你一样的错误。目测又是服务注册发现的锅。
郭强
你加上
protocol
前缀http://
试试。小陈
有一个现象不解, 多次运行"覆盖率 go test gclient" , 运行三四次后, 就会出现通不过现象, 除了gclient, 有时候ghttp/也有这个问题. 这样现象正常吗?
这两个也是这样.有时候能通过, 有时候不能通过
yidashi
这个组件绝对有严重bug,经常会service not found with name,搜了一下全局只有gsvc组件有这个报错字样,微服务那个注册发现组件。
诸如127.0.0.1和https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3dc4e250576e46c48859befbabbac423~tplv-k3u1fbpfcp-jj-mark:3024:0:0:0:q75.awebp#?w=2051&h=1234&s=1182425&e=png&b=fdfcfc这种url都会莫名其妙的访问不了,如果不是官方自带的http包可以访问,我都怀疑真的是我自己的问题了。
告诫各位尽量不要用
郭强
BUG个毛线,如果开启了全局服务发现,那么默认都会走服务发现组件,可以对个别请求关闭服务发现,具体可以看下文档:服务注册发现
yidashi
好的大佬
小陈
建议增加http重试功能, 比如网络不稳定情况下.