用Python语言调用OpenApi的post请求

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 是否正确生成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值