如何用Go包shurcooL/graphql或hasura/go-graphql-client设置请求头键值对?
在Go中使用shurcooL/graphql或hasura/go-graphql-client设置自定义请求头
两个包均基于标准库net/http,可通过自定义http.Client或请求修改器添加x-hasura-admin-secret这类自定义头,具体实现如下:
1. 使用shurcooL/graphql包
该包的graphql.Client依赖传入的http.Client,我们可以通过自定义RoundTripper为每个请求注入头信息:
package main import ( "context" "net/http" "github.com/shurcooL/graphql" ) // 自定义RoundTripper,用于添加请求头 type secretRoundTripper struct { original http.RoundTripper secret string } func (rt *secretRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { // 注入x-hasura-admin-secret头 req.Header.Set("x-hasura-admin-secret", rt.secret) return rt.original.RoundTrip(req) } func main() { // 替换为你的Hasura密钥和端点 adminSecret := "your-actual-admin-secret" graphqlEndpoint := "https://your-hasura-instance/v1/graphql" // 创建带自定义RoundTripper的http.Client httpClient := &http.Client{ Transport: &secretRoundTripper{ original: http.DefaultTransport, secret: adminSecret, }, } // 初始化graphql客户端 client := graphql.NewClient(graphqlEndpoint, httpClient) // 示例查询:获取用户列表 var query struct { Users []struct { ID graphql.ID Name graphql.String } `graphql:"users"` } err := client.Query(context.Background(), &query, nil) if err != nil { panic(err) // 实际项目中请优雅处理错误 } // 处理查询结果 for _, user := range query.Users { println("User ID:", user.ID, "Name:", user.Name) } }
2. 使用hasura/go-graphql-client包
这个包提供了更直接的WithRequestModifier方法,无需自定义RoundTripper即可添加头:
package main import ( "context" "net/http" "github.com/hasura/go-graphql-client" ) func main() { adminSecret := "your-actual-admin-secret" graphqlEndpoint := "https://your-hasura-instance/v1/graphql" // 初始化客户端 client := graphql.NewClient(graphqlEndpoint, nil) // 使用RequestModifier注入自定义头 client = client.WithRequestModifier(func(req *http.Request) { req.Header.Set("x-hasura-admin-secret", adminSecret) }) // 示例查询:获取用户列表 var query struct { Users []struct { ID graphql.ID Name graphql.String } `graphql:"users"` } err := client.Query(context.Background(), &query, nil) if err != nil { panic(err) // 实际项目中请优雅处理错误 } // 处理查询结果 for _, user := range query.Users { println("User ID:", user.ID, "Name:", user.Name) } }
若偏好自定义http.Client的方式,也可参考shurcooL包的实现,通过client.WithHTTPClient(httpClient)替换默认客户端。
内容的提问来源于stack exchange,提问作者Jackk-Doe
相关产品推荐
相关产品推荐

