如何给OpenAPITools生成的Golang客户端请求添加自定义Header?
给OpenAPITools生成的Golang客户端加自定义Header
先试试直接调用请求构建器的Header方法
OpenAPITools生成的Go客户端一般会给请求构建器提供Header()或者AddHeader()这类方法(具体名字可能随生成版本、配置略有不同),你可以直接插在链式调用里试试:
res, err := s.client.MyApi. SomeOperation(context.Background(), id). SomeOperationRequest(req). Header("X-Custom-Header", "你的自定义值"). Execute()
要是没找到这个方法,也可以看看请求结构体有没有SetHeader()方法,或者能不能直接修改Header属性:
reqBuilder := s.client.MyApi. SomeOperation(context.Background(), id). SomeOperationRequest(req) // 直接改请求的Header reqBuilder.Header.Set("X-Custom-Header", "你的自定义值") res, err := reqBuilder.Execute()
用Context传递Header也行
如果上面的方法行不通,还可以通过Context传Header。不过得先确认生成的客户端支持从Context里读Header——部分版本的生成代码会读取特定Context键对应的Header信息。
先定义一个自定义的Context键:
type contextKey string const customHeaderKey contextKey = "X-Custom-Header"
然后把Header值塞进Context里再发请求:
ctx := context.WithValue(context.Background(), customHeaderKey, "你的自定义值") res, err := s.client.MyApi. SomeOperation(ctx, id). SomeOperationRequest(req). Execute()
要是默认生成的代码没加这个逻辑,你就得改生成用的mustache模板,在构建请求的阶段加上从Context提取Header并添加到请求里的代码。
实在不行就自定义HTTP客户端拦截器
如果前两种方法都不管用,那就给客户端配个自定义HTTP客户端,通过拦截器在发请求前自动加Header:
// 先复制原有的Transport配置,保留默认的网络、TLS等设置 customTransport := &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).DialContext, ForceAttemptHTTP2: true, MaxIdleConns: 100, IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, } // 包装Transport,添加自定义Header customClient := &http.Client{ Transport: roundTripperFunc(func(req *http.Request) (*http.Response, error) { req.Header.Add("X-Custom-Header", "你的自定义值") return customTransport.RoundTrip(req) }), } // 把自定义客户端设置给生成的客户端 s.client.SetHTTPClient(customClient) // 之后正常发请求就行 res, err := s.client.MyApi. SomeOperation(context.Background(), id). SomeOperationRequest(req). Execute()
上面用到的roundTripperFunc是个辅助类型,定义如下:
type roundTripperFunc func(*http.Request) (*http.Response, error) func (f roundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) { return f(req) }
内容的提问来源于stack exchange,提问作者Jonathan R
相关产品推荐
相关产品推荐

