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
相关产品推荐
相关产品推荐

