Python Flask调用ManageEngine SDP API提交工单POST请求结构咨询
问题修正方案
核心错误点
- 请求体结构不符合要求:接口规定
x-www-form-urlencoded格式的请求体仅需携带一个参数:key为input_data,value为工单信息序列化后的JSON字符串。你的代码直接将工单嵌套字典传给data参数,requests会自动将字典的所有键拆解为独立的form参数,和接口要求完全不符。 - 鉴权头格式错误:官方要求鉴权头的前缀为
Zoho-Oauthtoken,而非你代码中写的Bearer。 - 变量取值错误:你已通过
OAuth2Session将凭证存储在session['oauth_token']中,但代码构造请求头时使用的token变量未定义来源,大概率取值错误。 - 参数位置错误:你将
input_data拼接在URL的查询参数位置,而接口要求该参数放在POST请求体中。
正确代码示例
import json import requests from flask import session @app.route("/log", methods=["GET"]) def log(): """Fetching a protected resource using an OAuth 2 token. """ # 取到正确的oauth token oauth_token = session['oauth_token']['access_token'] headers = { "Authorization": f"Zoho-Oauthtoken {oauth_token}", "Accept": "application/vnd.manageengine.sdp.v3+json", "Content-Type": "application/x-www-form-urlencoded" } # 构造工单信息字典 ticket_data = { "request": { "subject": "New Incident", "mode": { "name": "E-Mail", }, "group": { "name": "Incident" }, "requester": { "name": "Sarah Curtis Test" }, "status": { "name": "Open", }, "template": { "name": "Report an Incident" }, "request_type": { "name": "Incident", }, "description": "This is a test. please ignore", "category": { "name": "Incident" } } } # 序列化为JSON字符串,作为input_data的值 post_data = { "input_data": json.dumps(ticket_data) } # 发送请求,注意URL不要带input_data参数 resp = requests.post( 'https://sdpondemand.manageengine.eu/api/v3/requests', data=post_data, headers=headers ) # 打印响应信息排查问题,不需要可以删掉 print(resp.status_code, resp.text) return "请求完成"
调试建议
你可以通过打印请求的响应状态码和响应内容,直接获取接口返回的错误提示,不需要申请服务端日志权限。常见的报错会直接告诉你是鉴权失败、参数缺失还是字段格式错误。
内容的提问来源于stack exchange,提问作者sc-leeds
相关产品推荐
相关产品推荐

