You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用Python校验接口JSON响应合法性、解决报错并推送结果至Outlook

报错解决方案

报错原因

当requests.get()执行触发异常(如接口无法访问、网络超时等)时,变量r未完成赋值,后续在try-except代码块外直接访问r.text就会触发该报错。同时原代码还存在多个隐藏逻辑问题:

  • 未导入pandas库就调用pd.DataFrame
  • 创建DataFrame时指定的判断列Counts1不存在,实际定义的列名为Counts
  • 接口返回的计数为字符串类型,未转换为数值就做大小比较,判断逻辑不生效
  • 当接口地址不含?字符时,cdwcounturl变量未定义也会触发报错

修复后核心代码

import json, requests, urllib.parse, re
import pandas as pd
from termcolor import colored
import numpy as np
import sys

cdwenv1 = 'cdwu' #Note that it only works with the http version right now
cdwenv2 = 'cdwp'

#Dev Static
cdwenv  = '' #leave empty

# static
cdwEndPoints = [
                 'http://cdwu/cdw/counterparties?count=true'
                ,'http://cdwu/identifier/assets?count=true'
                ,'http://cdwu/identifier/assetListings?count=true'
]

# Check that Counts are different from 0
def countsCDWdata(input: list, cdwenv, flag=0):
   results = []
   for i, item in enumerate(input):
        # 修复cdwcounturl未定义问题
        cdwcounturl = item if '?' in item else f"{item}?count=true"
        count_val = None
        try:
            r = requests.get(cdwcounturl, timeout=10)
            r.raise_for_status() # 主动抛出4xx/5xx类响应异常
            count_val = int(r.text.strip()) # 字符串转数值
        except Exception as e:
            print(cdwcounturl, colored('is erroring', 'red'))
            count_val = 0 # 异常场景默认计数为0,标记为异常
        result = [cdwenv, count_val]
        sys.stdout.flush()
        sys.stdout.write('\r Queried '+ str(i+1) + ' out of ' + str(len(input)))   
        results.append([re.findall('//.*?/.*?/(.*?)/',item)[0], result[0], result[1]])
   if flag == 1:
      return(results)
   df = pd.DataFrame(results, columns = ['CDWEndpoint', 'CDW Env', 'Counts'])
   # 修复列名错误问题
   df['Status'] = np.where(df['Counts'] != 0, colored('Ok', 'green'), colored('not Ok', 'red'))
   sys.stdout.flush()
   sys.stdout.write('\r')
   print(df)
   return df

Outlook邮件发送实现方法

Windows环境下推荐使用pywin32库直接调用本地Outlook客户端发送邮件,无需配置SMTP密码,使用方法如下:

  1. 先安装依赖:pip install pywin32
  2. 新增邮件发送函数,传入校验结果DataFrame即可:
import win32com.client as win32
import os

def send_outlook_mail(result_df, receiver_list, subject="CDW接口计数校验结果"):
    # 初始化Outlook客户端
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    # 配置收件人,多个收件人用分号分隔
    mail.To = ';'.join(receiver_list)
    # 邮件主题
    mail.Subject = subject
    # DataFrame转HTML表格作为正文,保留颜色标记
    mail.HTMLBody = f"""
    <h3>CDW接口计数校验结果如下:</h3>
    {result_df.to_html(escape=False)}
    """
    # 可选:添加附件,比如把结果保存为Excel发送
    # result_df.to_excel("接口校验结果.xlsx", index=False)
    # mail.Attachments.Add(os.path.abspath("接口校验结果.xlsx"))
    # 发送邮件
    mail.Send()
    print("邮件发送成功")

# 调用示例
if __name__ == "__main__":
    check_result = countsCDWdata(cdwEndPoints, cdwenv1)
    # 替换为实际收件人邮箱
    send_outlook_mail(check_result, ["xxx@outlook.com", "yyy@company.com"])

如果是跨平台场景,可通过Outlook的SMTP服务发送邮件,需提前在Outlook账户设置中开启SMTP权限,使用smtplib库实现即可。


内容的提问来源于stack exchange,提问作者Bruno Lorena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:06:04