1、示例调用一个post请求接口添加成员分组
示例:post请求openapi接口信息
import requests
import json
import logging
import time
import uuid
# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
def call_openapi_post(api_url, payload, headers=None, timeout=10, success_status_codes=None, verify_ssl=True):
"""
自动调用 OpenAPI 的 POST 请求接口。
参数:
- api_url (str): API 的 URL。
- payload (dict): 请求体参数。
- headers (dict): 可选,自定义请求头。
- timeout (int): 请求超时时间(秒)。
- success_status_codes (list): 成功状态码列表,默认为 [200, 201]。
- verify_ssl (bool): 是否验证 SSL 证书,默认为 True。
返回:
- dict: API 响应数据。
"""
if headers is None:
headers = {}
# 合并默认请求头和用户传入的请求头
default_headers = {
'Content-Type': 'application/json',
'Accept': 'application/json, text/plain, */*'
}
headers = {**default_headers, **headers} # 用户传入的 headers 优先级更高
if success_status_codes is None:
success_status_codes = [200, 201]
try:
response = requests.post(api_url, data=json.dumps(payload), headers=headers, timeout=timeout, verify=verify_ssl)
# 检查响应状态码
if response.status_code in success_status_codes:
logging.info("请求成功,响应数据:")
try:
return response.json()
except ValueError as e:
logging.error(f"JSON 解析失败: {e}, 原始响应内容: {response.text}")
return None
else:
logging.error(f"请求失败,状态码: {response.status_code}, 错误信息: {response.text}")
return None
except requests.exceptions.Timeout:
logging.error("请求超时,请检查网络连接或增加超时时间。")
return None
except requests.exceptions.ConnectionError:
logging.error("连接失败,请检查 API 地址是否正确。")
return None
except Exception as e:
logging.error(f"请求发生异常: {e}")
return None
# 示例:API 地址和请求数据
api_url = "https://{ip:端口}/open/api/v2/users/groups"
payload = {
"name": "addtest",
"parentId": ""
}
# 动态生成 timestamp 和 nonce
current_timestamp = str(int(time.time() * 1000)) # 当前时间戳(毫秒)
random_nonce = str(uuid.uuid4()) # 随机 GUID
# 自定义请求头(可选)
headers = {
"Authorization": "Bearer <token>",
"timestamp": current_timestamp,
"nonce": random_nonce
}
# 调用 API,禁用 SSL 验证
response_data = call_openapi_post(api_url, payload, headers, verify_ssl=False)
if response_data:
print(json.dumps(response_data, indent=4))
else:
logging.error("API 调用失败,请检查日志信息。")
2、调用成功结果
3、调用失败时的排查思路
1. 问题分析
根据报错信息 ERROR - 连接失败,请检查 API 地址是否正确
,可以初步判断代码在尝试连接到指定的 API 地址时失败了。以下是可能的原因:
- API 地址错误:
api_url
可能指向了一个无效或不存在的服务器地址。 - 网络问题:本地网络无法访问该地址,可能是由于防火墙、代理设置或网络配置问题。
- SSL 验证问题:如果 API 使用 HTTPS 协议,而证书无效或未受信任,
requests
库会拒绝连接。 - 请求头或参数问题:即使地址正确,如果请求头(如
Authorization
)或请求体参数不正确,服务器可能会直接拒绝连接。
2. 排查步骤
(1) 检查 API 地址
确保 api_url
的值是正确的,并且可以通过浏览器或其他工具(如 Postman)访问。例如:
python
api_url = "https://{ip:端口}/open/api/v2/users/groups"
- 如果地址是内网地址(如
10.x.x.x
),需要确保当前设备在正确的网络环境中。 - 如果地址使用 HTTPS,确认其证书是否有效。
(2) 检查网络连接
运行以下命令测试网络连通性:
bash
ping {ip}
如果无法 ping 通,可能是网络配置问题。
(3) 检查 SSL 验证
如果 API 使用 HTTPS 协议,而证书无效或不受信任,可以临时禁用 SSL 验证(仅用于调试,生产环境不建议这样做):
python
response = requests.post(api_url, data=json.dumps(payload), headers=headers, timeout=timeout, verify=False)
(4) 检查请求头和参数
确保 headers
和 payload
的值符合 API 的要求。例如:
Authorization
是否为有效的 Bearer Token。timestamp
和nonce
是否正确生成。