gclient.Client
无论是通过g.Client或者gclient.New方法创建gclient.Client对象,该对象都应该保存下来复用,而不是每一次都新建Client对象,这样可以提高效率、降低资源使用、使用方式对GC友好。该对象内建连接池设计,可充分管理大量的短连接请求。由于Client对象对资源消耗不是很高,所以很多同学可能都没太注意这个点。
g.Client
gclient.New
Client
GC
什么情况下我应该新建gclient.Client对象而不是复用呢?你可以按照业务模块的解耦设计,每个业务模块单独管理维护自己的gclient.Client对象。也可以当针对不同的场景,使用Client的配置不同时,那么可以新建不同的Client来使用。
invalid semicolon separator in query
问题原因:默认表单请求中带;字符是非法的(需要urlencode)。具体请参考讨论:https://github.com/golang/go/issues/25192
;
urlencode
错误示例:
curl localhost:8000/Execute -d '{ "Component": "mysql", "ResourceId": "cdb-gy6hm0ee", "Port": 6379, "SQL": "show databases;", "UserName": "root", "Password": "" }'
修复示例:
提交请求的时候需要注明ContentType,例如这里应当标明是JSON请求。
ContentType
JSON
curl -X POST -H "Content-Type: application/json" localhost:8000/Execute -d '{ "Component": "mysql", "ResourceId": "cdb-gy6hm0ee", "Port": 6379, "SQL": "show databases;", "UserName": "root", "Password": "" }'
有些时候,调用方不是自己能控制的,可以在这里针对具体的API手动修改 Content-Type 值
func (s *sMiddleware) MiddlewareCORS(r *ghttp.Request) { corsOptions := r.Response.DefaultCORSOptions() r.Response.CORS(corsOptions) // Content-Type 不正确,需要移除重新赋值 if r.Request.URL.Path == "/api/v1" { r.Request.Header.Del("Content-Type") r.Request.Header.Add("Content-Type", "application/json") } r.Middleware.Next() }
g.client 既然是一个单例对象。 为什么还需要保存复用呢? 单例来说 每次获取到的 g.client 应该都是同一个对象 。 也就是说 框架会自动保存g.client 对象 。 那为什么还需要业务层来保存复用
看源码, g.client不是单例, 猜测应该是考虑到cookie这些, 所以没有做成单例吧.
3 Comments
john
有些时候,调用方不是自己能控制的,可以在这里针对具体的API手动修改 Content-Type 值
zhaolm
g.client 既然是一个单例对象。 为什么还需要保存复用呢?
单例来说 每次获取到的 g.client 应该都是同一个对象 。 也就是说 框架会自动保存g.client 对象 。 那为什么还需要业务层来保存复用
小陈
看源码, g.client不是单例, 猜测应该是考虑到cookie这些, 所以没有做成单例吧.