用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密码,使用方法如下:
- 先安装依赖:
pip install pywin32 - 新增邮件发送函数,传入校验结果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
相关产品推荐
相关产品推荐

