Python Requests无法提交ISO 8601格式日期至JSON请求体的问题
解决ISO 8601格式不匹配的API请求问题
你遇到的核心问题是:Python默认生成的ISO 8601格式缺少UTC时区标记Z,而目标API明确要求带这个标记的格式(就像你手动测试成功的2019-12-17T15:39:55.616Z那样)。
问题原因
你用datetime.datetime.now()或today()生成的是不带时区信息的naive datetime对象,调用isoformat()后得到的是类似2023-10-05T14:20:30.123的字符串——没有时区标识,而API期望的是UTC时区的ISO格式,必须以Z结尾(Z是UTC时间的标准标记)。
解决方案
这里有两种简单的修复方式,都能生成符合API要求的格式:
方法1:直接使用UTC时间并添加Z后缀
最直接的方式是生成UTC时间,然后给isoformat()的结果加上Z:
import datetime import requests # 获取当前UTC时间和昨日UTC时间 curr_utc = datetime.datetime.utcnow() prev_utc = curr_utc - datetime.timedelta(days=1) # 生成带Z的ISO 8601格式字符串 curr_date_iso = curr_utc.isoformat() + 'Z' prev_date_iso = prev_utc.isoformat() + 'Z' # 构造请求体 DATA = {'verb': 'query', 'start_time': prev_date_iso, 'end_time': curr_date_iso} # 发送请求(建议用requests的json参数,自动处理序列化) response = requests.post(f"{Host}{url}", headers=Header, json=DATA, verify=False)
小贴士:用
requests.post的json参数可以直接传入字典,不需要手动调用json.dumps(),更简洁还能避免序列化细节出错。
方法2:使用带时区感知的datetime对象(Python 3.9+)
如果你的Python版本是3.9及以上,可以用标准库的zoneinfo模块生成带UTC时区的datetime对象,再把默认的时区后缀+00:00替换成Z:
from datetime import datetime, timedelta from zoneinfo import ZoneInfo import requests # 生成带UTC时区的时间对象 curr_date = datetime.now(ZoneInfo('UTC')) prev_date = curr_date - timedelta(days=1) # 将+00:00替换为Z,完全匹配API要求的格式 curr_date_iso = curr_date.isoformat().replace('+00:00', 'Z') prev_date_iso = prev_date.isoformat().replace('+00:00', 'Z') DATA = {'verb': 'query', 'start_time': prev_date_iso, 'end_time': curr_date_iso} response = requests.post(f"{Host}{url}", headers=Header, json=DATA, verify=False)
验证
用上面两种方法生成的日期格式会和你手动测试成功的示例完全一致,API应该就能正常识别起止时间参数了。
内容的提问来源于stack exchange,提问作者malFUNKtion
相关产品推荐
相关产品推荐

