奇怪的python请求消息大小

时间:2017-11-03 13:25:26

标签: python http python-requests

我有一种奇怪的情况,即内容较轻的请求最终消耗的字节数多于内容较大的请求。

这是我的代码:

import requests
import base64

def do_work(image_raw, image_name):
    url = 'http://httpbin.org/post'

    data = {'pic':image_raw}
    res = requests.post(url, data=data, json={'name':image_name})
    print len(image_raw), len(res.content)

    image_enc = base64.b64encode(image_raw)
    res = requests.post(url=url, json={'pic':image_enc, 'name':image_name})
    print len(image_enc), len(res.content)

典型的结果是:

  

68166 925208

     

90888 182301

编码图像比原始图像重33%,这非常有意义。 但为什么第一个要求的重量要多得多呢? 我格式化请求的方式肯定有问题。

1 个答案:

答案 0 :(得分:1)

注意:我使用的是Python 3,我的/api/v1/topology/summary是一个image_raw对象,因此结果会有所不同(可能是因为byte之类的内容之间存在差异,byteunicode),但解释应该适用。

有助于打印出实际str的一部分。在第一种情况下:

res.content

在第二种情况下:

>>> res.content[:200]
b'{\n  "args": {}, \n  "data": "", \n  "files": {}, \n  "form": {\n    "pic": "\\ufffdPNG\\r\\n\\u001a\\n\\u0000\\u0000\\u0000\\rIHDR\\u0000\\u0000\\u0001\\u000f\\u0000\\u0000\\u0000\\u0019\\b\\u0002\\u0000\\u0000\\u0000\\ufffd\\uf'

如您所见,>>> res.content[:200] b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "name": "1.png", \n "pic": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAAZCAIAAACgtTxbAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAc' http://httpbin.org/post返回的字符串实际上是POST数据的人类可读表示。在第一种情况下,POST数据包含许多非ASCII字符,这些字符以比base64 - res.content转义序列更低效的编码进行编码。这就是为什么\uxxxx的长度在第一种情况下更长。