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

Go调用Tanium REST API的DELETE接口时请求体验证报错

Tanium REST API批量删除抑制规则请求体验证错误问题

使用Go语言调用Tanium REST API的批量删除抑制规则接口时,明明在请求体中包含了selected字段,却始终收到请求体验证错误,提示"value必须包含selected或filters中的至少一个"。但使用Python调用同一接口却能正常执行。

Go 实现代码

func (t *TaniumClient) deleteSuppressionRules(ruleId []int) error {
    //TODO: Fix this messy code
    url := t.BaseUrl + "/plugin/products/threat-response/api/v1/suppression-rules/bulk/delete"
    var selectedIDs, selected []int
    var selection string

    if len(ruleId) != 0 {
        for _, rID := range ruleId {
            selectedIDs = append(selectedIDs, rID)
        }
        selection = "include"
        selected = selectedIDs
    } else {
        selectedIDs = append(selectedIDs, 9999)
        selection = "exclude"
        selected = selectedIDs
    }

    delBody := deleteRequestBody{
        SelectionMode: selection,
        Selected: selected
    }

    marshalled, err := json.Marshal(delBody)
    if err != nil {
        return err
    }

    req, err := http.NewRequest("DELETE", url, bytes.NewBuffer(marshalled))
    if err != nil {
        return err
    }
    req.Header.Add("session", t.SessionToken)
    req.Header.Add("User-Agent", userAgent)

    if _, err := t.doRequest(req); err != nil {
        return err
    }

    return nil
}

type deleteRequestBody struct {
    SelectionMode string                `json:"selectionMode"`
    Filters       []deleteRequestFilter `json:"filters,omitempty"`
    Selected      []int                 `json:"selected"`
}

func (t *TaniumClient) doRequest(req *http.Request) ([]byte, error) {
    req.Header.Add("session", t.SessionToken)
    req.Header.Add("User-Agent", userAgent)

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }
    if !(resp.StatusCode >= 200 && resp.StatusCode < 300) {
        return nil, fmt.Errorf("%s", body)
    }
    return body, nil
}

错误响应

{
    "errors": [
        {
            "code": "BadRequest",
            "description": "\"value\" must contain at least one of [selected, filters]",
            "details": [
                {
                    "message": "\"value\" must contain at least one of [selected, filters]",
                    "path": [],
                    "type": "object.missing",
                    "context": {
                        "peers": [
                            "selected",
                            "filters"
                        ],
                        "peersWithLabels": [
                            "selected",
                            "filters"
                        ],
                        "label": "value",
                        "value": {
                            "selectionMode": "include"
                        }
                    }
                }
            ]
        }
    ]
}

正常工作的Python代码

def deleteSuppressionRules(self, selected_ids:[int] = []) -> str:
    url = t.BaseUrl + "/plugin/products/threat-response/api/v1/suppression-rules/bulk/delete"

    if len(selected_ids) < 1:
        payload = {
            "selectionMode": "exclude",
            "selected": [
                9999
            ]
        }
    else:
        payload = {
            "selectionMode": "include",
            "selected": selected_ids
        }

    headers = {"session": self.sessionToken}

    response = requests.request("DELETE", url, json=payload,
                                headers=headers, verify=False)

问题原因与解决方案

问题出在Go代码的请求头中缺少Content-Type: application/json。Python的requests库在使用json参数传递请求体时,会自动添加这个请求头,确保服务端能正确识别并解析JSON格式的请求体;而Go代码中没有设置该头,导致Tanium API无法正确解析请求体,进而认为selected字段不存在。

修改Go代码,在构造请求时添加该请求头即可解决:

req, err := http.NewRequest("DELETE", url, bytes.NewBuffer(marshalled))
if err != nil {
    return err
}
req.Header.Add("session", t.SessionToken)
req.Header.Add("User-Agent", userAgent)
// 添加这一行指定请求体格式
req.Header.Add("Content-Type", "application/json")

另外注意,doRequest函数中重复添加了session和User-Agent头,虽然不影响功能,但可以考虑去掉重复代码。

内容的提问来源于stack exchange,提问作者Alex_N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:24:55