【问题标题】:How to serialize requests Response object as HAR如何将请求响应对象序列化为 HAR
【发布时间】:2019-10-19 22:03:16
【问题描述】:

我想将requestsResponse对象序列化为json,最好是HAR格式。

import requests
resp = requests.get('http://httpbin.org/get')

har = to_har(resp)  # <--- magic

但是用我的 google-fu 能力在网上找不到任何东西。

似乎所有数据都存在于Response 对象上,我希望我不需要实现整个 HAR 规范并且存在一些我可以重用的代码/实用程序。

一个有效的答案可能会给出: 如果python 和/或requests 到目前为止不存在任何内容,请参考现有库或参考起点。

目前我更简单的 3 分钟解决方案(不是 HAR 格式)序列化为 Response 对象看起来像这样(如果什么都不存在,可能是一个很好的起点):

def resp2dict(resp, _root=True):
    d = {
        'text': resp.text,
        'headers': dict(resp.headers),
        'status_code': resp.status_code,
        'request': {
            'url': resp.request.url,
            'method': resp.request.method,
            'headers': dict(resp.request.headers),
        },
    }

    if _root:
        d['history'] = [resp2dict(h, False) for h in resp.history]
    return d

我发布此内容是因为我认为无论 HAR 格式如何,我都很难将 Response 对象序列化为 json。

【问题讨论】:

  • 我认为大多数人都对resp.json() 感到满意,我不知道它可能符合也可能不符合HAR。您还可以向resp.json() 返回的dict 添加字段。
  • resp.json() 仅适用于 json 响应,并且仅序列化响应的主体。您不会序列化标头、url、请求或重定向历史记录。它与我想要解决的问题不同。它实际上是反序列化味精而不是序列化

标签: python python-3.x serialization python-requests har


【解决方案1】:

目前我更简单的 3 分钟解决方案(不是 HAR 格式)序列化到 Response 对象看起来像这样(如果什么都不存在,这可能是一个很好的起点):

看起来这是最好的解决方案。我检查了 PyPI 上所有与 HAR 相关的库,发现的唯一解决方案(har2requests 除外)是marshmallow-har。不幸的是,marshmallow_har.Response.__schema__ 既不匹配 requests.Response 也不匹配 urllib3.response.HTTPResponse 的内部结构。所以,我看到的解决方案是:

  1. 像以前一样使用临时解决方案。为确保结果具有正确的结构,可以使用marshmallow-har
  2. 通过向字段提供attribute 参数来创建自己的棉花糖模式。我建议分叉和扩展marshmallow-har,但它使用工厂和其他奇怪的魔法,不能轻易扩展。所以,最好从零开始。

并考虑开源您的解决方案:)

【讨论】:

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