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

24

我想将requests Response对象序列化为JSON,最好是以HAR格式。

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

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

但是我用我的谷歌技能没找到任何在线信息。

似乎所有的数据都存在于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

我发布这篇文章是因为我认为不仅仅是我自己在一般情况下无法将Response对象序列化为JSON格式,而不考虑HAR格式。


2
我认为大多数人对 resp.json() 感到满意,这可能与HAR是否兼容无关,我不知道。您还可以向 resp.json() 返回的 dict 添加字段。 - gaFF
1
resp.json() 仅适用于 JSON 响应,并且仅序列化响应正文。您不需要序列化标头、URL、请求或重定向历史记录。这是一个与我要解决的问题不同的问题。实际上,它是对消息进行反序列化而不是序列化。 - ShmulikA
2个回答

2
目前,我的简单3分钟解决方案(不是HAR格式)序列化到响应对象看起来像这样(如果没有其他现成的东西,这可能是一个好的起点):
看起来这是最好的解决方案。我检查了PyPI上与HAR相关的所有库,除了har2requests之外,我发现唯一接近的解决方案是marshmallow-har。不幸的是,marshmallow_har.Response.__schema__既不匹配requests.Response也不匹配urllib3.response.HTTPResponse的内部结构。因此,我看到的解决方案有:
  1. 像你已经做的那样使用临时解决方案。为了确保结果具有正确的结构,可以使用marshmallow-har
  2. 通过为字段提供attribute参数来创建自己的marshmallow模式。我建议分叉并扩展marshmallow-har,但它使用工厂和其他奇怪的魔法,并且不能轻松地扩展。因此,最好从零开始。
考虑开源你的解决方案 :)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接