Python 如何从vcrpy二进制响应字符串中提取未压缩文本?

Python 如何从vcrpy二进制响应字符串中提取未压缩文本?,python,mocking,yaml,Python,Mocking,Yaml,我正在使用自动http模拟测试我的应用程序。这很有效。然而,我的模拟包括编码“gzip”和“deflate”,这意味着vcrpy记录响应是二进制格式的。下面是一个例子: interactions: - request: body: null headers: Accept: ['*/*'] Accept-Encoding: ['gzip, deflate'] Authorization: [Basic Y2hlc3RlcjpiYWRnZXI=]

我正在使用自动http模拟测试我的应用程序。这很有效。然而,我的模拟包括编码“gzip”和“deflate”,这意味着vcrpy记录响应是二进制格式的。下面是一个例子:

interactions:
- request:
    body: null
    headers:
      Accept: ['*/*']
      Accept-Encoding: ['gzip, deflate']
      Authorization: [Basic Y2hlc3RlcjpiYWRnZXI=]
      Connection: [keep-alive]
      User-Agent: [python-requests/2.9.1]
    method: GET
    uri: http://localhost:8153/go/compare/DeployProduction/14/with/15
  response:
    body:
      string: !!binary |
        H4sIAAAAAAAAAO08bXPbNpPf8ytQ9q6yp+Y7KZGKrU7quG1mEscXO7276XQ0IAlKjCmCQ0KW9TxP
        /vstAJIiJUpxkkvS3tmTiSRisVjsG3YXIE6/e/76/Oa/ry7QbzevXk6enM7ZIkX3izQrz5Q5Y/lY
        11erlbayNVrMdNP3ff2ewygcluBo8gTB3ylLWErk93O6yHFB0FWSkzTJSImu8IwgFf1Kn5zqFeCT
        U2i6RREJlrMzJcZpSRQ0L0h8pugzquOyJKzUcZ6nSYhZQjPVCG0PE9saObHthJbjE2L79tCPhhY2
        ImxZlhEH2Hbt0PB8NyCBZ8RO6NsksoZDi1haWJYKWpAowWcKTlMFFSQ9U0q2Tkk5J4QpSJ88jKwc
        M0aKrEtf6EeBEYXG0ByFERmR2A9sO8CmPzR8LyAYEyOwwpHj48COseOaLgmsUehiHAxjOzYfRt+T
        0+9UFV3fPHtzM0Z5QRll65ygOaW3JYppgQALSrJ3JOREIVWtu1xcPn94hzIskpxtsaEswr3CCYwA
        pjUMh8Qf+iZIY2hGpu063iiyTOyDUPxRbFrRyPJHxHRBIiChKIij2LfMUWxo70plcqrLcUEK3/2R
(省略附加输出)

我已经读过了,但它没有解决二进制yaml的解码问题


为了查看原始文本并验证测试结果,如何将这些二进制字符串转换为原始格式?

yaml文件中的主体字符串是base64编码的,但加载时,您将获得原始ByTestStream。如果你好奇的话,读一读,虽然这不是必要的

如果前三个字节是
\x1f\x8b\x08
,您就知道有一个gzip bytestream。如果您想手动解码,请阅读,但vcr为您提供了一个包装方法,它还将在解码正文后更新一些标题信息。此函数是vcr.filters.decode\u response()

为了用一个例子来演示这一点,我将使用这个文件。有两个交互,其中第二个包含编码数据

import yaml
from vcr.filters import decode_response 

with open('domain_redirect.yaml', 'r') as f:
    doc = yaml.load(f)

response = doc['interactions'][1]['response']
decoded = decode_response(response)
print(decoded['body']['string'])

在那里,他们讨论了Python 3中的请求体是经过编码的。感谢@Reti43,我也发现了Github的问题,并在堆中添加了我自己的问题:@EdwardTeach我不明白解码主体字符串有什么困难。在yaml文件中,它保存为base64字符串,但在
yaml.load()之后,它将是一个bytestring。我的示例代码对您有用吗?很抱歉误解:是的,应该有用,谢谢!我已经接受了你的回答。我认为正确的软件包名称是
vcr.filters
而不是
filter
。见: