POST 对 Splunk REST 的查询 API /search/jobs/ Golang 中的端点

POST a query to Splunk REST API /search/jobs/ endpoint in Golang

我想发送一个 search/query 到 Splunk REST API,并 return 一个搜索 ID 以便稍后使用结果。

我可以通过以下 curl:

实现所需的行为
#!/bin/bash

user='my_user'
pass='my_pass'

search='search index=short sourcetype=src | head 5'

curl -u $user:$pass -k https://111.22.33.44:8089/services/search/jobs -d search="$search"

其中 return 个:

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <sid>234523452435.6556_234234-3J3J-34J4-2345-123456678E3</sid>
</response>

以下是我试图在其中实现相同目标的相关 Go 片段:

主要:

  //main.go
    sid, err := conn.Query()
    if err != nil {
            fmt.Println("err creating search: %s", err)
    } else {
            fmt.Println("sid:", sid)
    }

查询:

    // query.go
    func (conn SplunkConnection) Query() (string, error) {
            data := make(url.Values)
            data.Add("output_mode", "json")
            data.Add("search%20index%3Dshort%20sourcetype%3Dsrc%20%7C%20head%205", "search")
            data.Add("-60m%40m", "earliest")
            data.Add("-10m%40m", "latest")

        // try httpGet() here
        sid, err := conn.httpPost(fmt.Sprintf("%s/services/search/jobs", conn.BaseURL), &data)
        if err != nil {
                return "", err
        }

        return string(sid), err
}

助手:

// http.go
func (conn SplunkConnection) httpPost(url string, data *url.Values) (string, error) {
        return conn.httpCall(url, "POST", data)
}

我期望的是一个仅包含 JSON blob 和我的 SID 的响应。相反,它 return 是一个巨大的 JSON,它似乎包含 /services/search/jobs 端点上的所有当前作业。

如何将我的代码调整为 return 只有 SID? (我打算对其进行轮询以完成并稍后检索结果,但目前不需要帮助...)。

您似乎颠倒了您的 postdata 参数。

            data.Add("search%20index%3Dshort%20sourcetype%3Dsrc%20%7C%20head%205", "search")

这变成了search index=short sourcetype=src | head 5 = search,这与你想要的相反。

The key comes first, then the value,但是你先指定值,再指定键。

我认为这应该是:

            data.Add("search", "search%20index%3Dshort%20sourcetype%3Dsrc%20%7C%20head%205")

我怀疑你对 url.Values.Add() 的其他一些调用也是如此,所以你应该检查所有这些并确定。