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()
的其他一些调用也是如此,所以你应该检查所有这些并确定。
我想发送一个 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()
的其他一些调用也是如此,所以你应该检查所有这些并确定。