如何在Go的GraphQL多行字符串查询中传递变量?
在Go中给GraphQL查询传入命令行参数变量
你现在的问题是没正确传递GraphQL变量——GraphQL的POST请求需要把查询语句和变量分开传递,不是直接在字符串里替换。按下面的步骤修改代码:
关键修改点
- 请求体需要包含
query和variables两个字段:GraphQL服务会通过variables字段读取你传入的变量值,而不是直接解析查询字符串里的$input标记。 - 设置正确的请求头:必须告诉服务请求体是JSON格式,否则无法正确解析。
- 按API定义构造变量结构:
$input对应的是managerinput类型,你需要根据实际API的输入结构来构造变量值(下面示例假设managerinput包含一个name字段,你要根据自己的API调整)。
修改后的完整代码
package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" "os" "time" ) func main() { if len(os.Args) < 2 { fmt.Println("请传入命令行参数") os.Exit(1) } input := os.Args[1] // 构造GraphQL请求体:包含查询语句和变量 jsonData := map[string]interface{}{ "query": ` mutation manager($input: managerinput!) { manager(input: $input) { name error { ...SystemError } } } `, "variables": map[string]interface{}{ "input": map[string]string{ "name": input, // 这里替换为managerinput要求的字段,比如如果API需要的是id就改成"id": input }, }, } jsonValue, err := json.Marshal(jsonData) if err != nil { fmt.Printf("JSON序列化失败: %s\n", err) return } request, err := http.NewRequest("POST", "https://<GRAPHQL_API_HERE>", bytes.NewBuffer(jsonValue)) if err != nil { fmt.Printf("创建请求失败: %s\n", err) return } // 必须设置Content-Type请求头 request.Header.Set("Content-Type", "application/json") client := &http.Client{Timeout: time.Second * 10} response, err := client.Do(request) if err != nil { fmt.Printf("HTTP请求失败: %s\n", err) return } defer response.Body.Close() data, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Printf("读取响应失败: %s\n", err) return } fmt.Println(string(data)) }
额外说明
- 不要直接拼接字符串到查询语句里,这种做法会有GraphQL注入风险,而且不符合规范。
- 如果你的
managerinput类型结构不同(比如需要多个字段),只需要修改variables里的input对象即可,比如:"input": map[string]interface{}{ "id": input, "age": 25, }
内容的提问来源于stack exchange,提问作者winterlyrock
相关产品推荐
相关产品推荐

