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

如何在Go的GraphQL多行字符串查询中传递变量?

在Go中给GraphQL查询传入命令行参数变量

你现在的问题是没正确传递GraphQL变量——GraphQL的POST请求需要把查询语句和变量分开传递,不是直接在字符串里替换。按下面的步骤修改代码:

关键修改点

  1. 请求体需要包含query和variables两个字段:GraphQL服务会通过variables字段读取你传入的变量值,而不是直接解析查询字符串里的$input标记。
  2. 设置正确的请求头:必须告诉服务请求体是JSON格式,否则无法正确解析。
  3. 按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:25:15