You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:35:12