求助, golang http post 请求问题
期望结果:
- 正确获取 itop rest api 返回的工单数据
当我使用 Python 的 requests 库时,这一切都很正常,获取数据成功(如果我覆盖默认 headers,获取的结果如 golang 版本的一样。
这是 Python 的代码:
#!/usr/bin/python3 import requests, json HOST = "http://192.168.17.22:8096/itop/webservices/rest.php?version=1.3" json_str = json.dumps({ "operation": "core/get", "class": "UserRequest", "key": "SELECT UserRequest WHERE operational_status = 'ongoing'", "output_fields": "request_type,servicesubcategory_name,urgency,origin,caller_id_friendlyname,impact,title,description", }) json_data = { "auth_user": "admin", "auth_pwd": "[email protected]", "json_data": json_str } # secure_rest_services def get(): r = requests.post(HOST, data=json_data) return r if __name__ == "__main__": result = get() print(result.json())
输出
{'objects': {'UserRequest::7': {'code': 0, 'message': '', 'class': 'UserRequest', 'key': '7', 'fields': {'request_type': 'service_request', 'servicesubcategory_name': '钉钉权限开通', 'urgency': '4', 'origin': 'portal', 'caller_id_friendlyname': 'x 阿里合作项目负责人', 'impact': '1', 'title': '溫江|A-222|wb-xxxxxxxx', 'description': '<p>this is a test approve...</p>'}}, 'UserRequest::6': {'code': 0, 'message': '', 'class': 'UserRequest', 'key': '6', 'fields': {'request_type': 'service_request', 'servicesubcategory_name': '钉钉权限开通', 'urgency': '3', 'origin': 'portal', 'caller_id_friendlyname': 'x 阿里合作项目负责人', 'impact': '1', 'title': '成都|Xa-111|wb-xx111111', 'description': '<p>這是一個測試用的用戶需求</p>'}}}, 'code': 0, 'message': 'Found: 2'}
下面时 golang 版本的 post 请求
主函数:
package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "log" "net/http" "strconv" ) // 釘釘應用程序的 agentid const ( ITOP_URL = `http://192.168.17.22:8096/itop/webservices/rest.php?version=1.3` ) func main() { request_auth := new(RequestAuth) request_data := new(RequestData) request_auth.AuthUser = "admin" request_auth.AuthPwd = "[email protected]" request_data.Operation = "core/get" request_data.Class = "UserRequest" request_data.Key = "SELECT UserRequest WHERE operational_status = "ongoing"" request_data.OutPutFields = "request_type,servicesubcategory_name,urgency,origin,caller_id_friendlyname,impact,title,description" req_data, err := json.Marshal(request_data) if err != nil { panic(err) } request_auth.JsonData = string(req_data) jsonData, err := json.Marshal(request_auth) if err != nil { panic(err) } reader := bytes.NewReader(jsonData) result := Post(ITOP_URL, reader) fmt.Println(string(result)) } func Post(url string, reader *bytes.Reader) []byte { request, err := http.NewRequest("POST", url, reader) if err != nil { panic(err) } request.Header.Set("Content-Type", "application/json") request.Header.Set("Content-Length", strconv.Itoa(reader.Len())) client := http.Client{} resp, err := client.Do(request) if err != nil { log.Fatal(err.Error()) } defer resp.Body.Close() respBytes, _ := ioutil.ReadAll(resp.Body) return respBytes }
post 携带的数据模型
package main // UserRequest structure type Base struct { Code int `json:"code"` Message string `json:"message"` } type Fileds struct { RequestType string `json:"request_type"` ServiceSubcategoryName string `json:"servicesubcategory_name"` Urgency string `json:"urgency"` Origin string `json:"origin"` CallerIdFriendlyName string `json:"caller_id_friendlyname"` Impact string `json:"impact"` Title string `json:"title"` Description string `json:"description"` } type ResponseContent struct { Code int `json:"code"` Message string `json:"message"` Class string `json:"class"` Key string `json:"key"` Filed Fileds `json:"fields"` } type Response struct { Base Object map[string]ResponseContent `json:"objects"` } // Request api data struct type RequestData struct { Operation string `json:"operation"` Class string `json:"class"` Key string `json:"key"` OutPutFields string `json:"output_fields"` } type RequestAuth struct { AuthUser string `json:"auth_user"` AuthPwd string `json:"auth_pwd"` // JsonData RequestData `json:"json_data"` JsonData string `json:"json_data"` }
输出:
{"code":5,"message":"Error: Missing parameter 'auth_user'"}
我猜这应该是 itop 需要 post 请求携带某个 header ?但我折腾了太久,直到实在没有办法才发帖求助。
求大佬们指点,(拜谢