Azure Stack API性能指标查询ISO 8601时间格式错误排查求助
问题排查与解决方案
从你的错误信息和生成的URI来看,有两个关键问题需要解决:
1. URI参数名重复(最直接的错误原因)
看你生成的URI片段:
reportedStartTime=reportedStartTime=2021-11-06T08%3a07%3a32.327%2b00%3a00
这里重复写了reportedStartTime=,导致服务器接收到的参数值是reportedStartTime=2021-11-06T08:07:32.327+00:00,这完全不符合ISO 8601格式要求,这是触发错误的直接原因。
2. 时间格式不符合Azure Stack的要求
错误提示明确要求格式为YYYY-MM-DDTHH:mm:ss.sssZ,也就是UTC时间需要用Z结尾,而不是+00:00。你之前尝试过替换,但可能没正确应用,或者因为参数重复的问题先暴露了。
修正后的代码实现
推荐使用Python的urllib.parse.quote来处理URI转义,比手动替换更可靠,同时直接生成符合要求的Z结尾格式:
import datetime import urllib.parse # 生成UTC时间,直接替换+00:00为Z reported_end_time = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec='milliseconds').replace('+00:00', 'Z') reported_start_time = (datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(hours=72)).isoformat(timespec='milliseconds').replace('+00:00', 'Z') # 使用urllib.parse.quote进行URI转义 escaped_start = urllib.parse.quote(reported_start_time) escaped_end = urllib.parse.quote(reported_end_time) # 构建正确的URI(注意不要重复参数名) uri = f"https://adminmanagement.example.com/subscriptions/{{subscriptionID}}/providers/Microsoft.Commerce.Admin/subscriberUsageAggregates?reportedStartTime={escaped_start}&reportedEndTime={escaped_end}&aggregationGranularity=Hourly&api-version=2015-06-01-preview"
验证生成的时间格式
修正后生成的时间字符串应该类似:2021-11-06T08:07:32.327Z
转义后在URI中会是:2021%2D11%2D06T08%3A07%3A32%2E327Z
这样服务器就能正确识别为符合要求的ISO 8601格式了。
另外,手动替换字符容易遗漏或出错,比如你之前转义了+但实际上我们用Z代替了+00:00,所以不需要处理+号了,用urllib.parse.quote能自动处理所有需要转义的字符(比如:、-、.等),更稳妥。
内容的提问来源于stack exchange,提问作者Juan Luis Prieto Martínez
相关产品推荐
相关产品推荐

