【发布时间】:2020-01-11 16:25:35
【问题描述】:
在使用 python 3 获取 gzip 压缩的 JSON 有效负载时遇到了一些麻烦
def post_data ( data ) :
method_name = json.loads(data)['subject'][4][0][1]
instance = json.loads(data)['serialNumber']
timestamp = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
utc_now = datetime.datetime.utcnow().strftime("%m-%d-%Y %H:%M:%S")
not_after = datetime.datetime.strptime(json.loads(data)['notAfter'], "%b %d %H:%M:%S %Y GMT" ).strftime("%m-%d-%Y %H:%M:%S")
days = datetime.datetime.strptime(not_after, "%m-%d-%Y %H:%M:%S")-\
datetime.datetime.strptime(utc_now, "%m-%d-%Y %H:%M:%S")
values = days.days
raw_json = '''{"MetricReports":[{
"Metadata":{
"MinPeriod":"FiveMinute",
"MaxPeriod":"FiveMinute"
},
"Namespace":"Schema/Service",
"Metrics":[{
"Dimensions":{
"DataSet":"NONE",
"Marketplace":"PDX",
"HostGroup":"ALL",
"Host":"host.com",
"ServiceName":"Server",
"MethodName":"%s",
"Client":"ALL",
"MetricClass":"instance",
"Instance":"%s"
},
"MetricName":"daysToExpiry",
"Timestamp":"%s",
"Type":"MetricsLine",
"Unit":"None",
"Values":%s
}
]}
]}''' %(method_name, instance, timestamp, values)
headers = {'content-type' : 'application/x-gzip'}
putUrl = 'http://api-pdx.com/'
session = boto3.Session()
credentials = session.get_credentials()
region = 'us-west-2'
service = 'monitor-api'
auth = AWS4Auth(
credentials.access_key,
credentials.secret_key,
region,
service,
session_token = credentials.token)
r = requests.post(url = putUrl, json = gzip.compress(raw_json) , auth = auth, headers = headers, verify=False)
print(r.content)
get_data()
post_data(data)
我需要压缩 raw_json,因为 API 需要压缩附件。如果我尝试按原样发送 JSON,API 会返回“HTTP 请求无效。原因:无效的 JSON 附件:不是 GZIP 格式”。
我尝试了 gzip.compress,但它说:memoryview: a bytes-like object is required, not 'str'
所以我尝试了 gzip.compress(json.dumps(raw_json).encode('utf-8')) 并且说字节类型的对象不是 JSON 可序列化的
【问题讨论】:
-
尝试使用
data参数而不是json:requests.post(url = putUrl, data= gzip.compress(json.dumps(raw_json).encode('utf-8')) , auth = auth, headers = headers, verify=False) -
斯坦尼斯拉夫,请将其发布为答案。我要表扬。
标签: json python-3.x gzip