如何将请求响应对象序列化为 HAR

Posted

技术标签:

【中文标题】如何将请求响应对象序列化为 HAR【英文标题】:How to serialize requests Response object as 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、请求或重定向历史记录。它与我想要解决的问题不同。它实际上是反序列化味精而不是序列化 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如何将请求响应对象序列化为 HAR的主要内容,如果未能解决你的问题,请参考以下文章

如何将属性序列化为 json 对象?

如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?

如何使用 System.Text.Json API 将流反序列化为对象

如何在.Net Core 3.1中异步地将一个对象序列化为JSON并写入管道?

Json.NET:将嵌套数组反序列化为强类型对象

如何将字符串反序列化为对象,然后在颤振中设置为泛型