【问题标题】:Python 3 Gzip json for post on an APIPython 3 Gzip json 用于在 API 上发布
【发布时间】: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参数而不是jsonrequests.post(url = putUrl, data= gzip.compress(json.dumps(raw_json).encode('utf-8')) , auth = auth, headers = headers, verify=False)
  • 斯坦尼斯拉夫,请将其发布为答案。我要表扬。

标签: json python-3.x gzip


【解决方案1】:

要使用requests.post 方法发送二进制数据,它们应该作为data 参数传递,而不是json

requests.post(url = putUrl,
              data = gzip.compress(json.dumps(raw_json).encode('utf-8')),
              auth = auth,
              headers = headers,
              verify=False)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多