如何将请求响应对象序列化为 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的主要内容,如果未能解决你的问题,请参考以下文章
如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?
如何使用 System.Text.Json API 将流反序列化为对象