Aiohttp:如何在标头中发送字节?

时间:2017-12-26 06:42:46

标签: python http asynchronous python-asyncio aiohttp

我正在尝试通过aiohttp发送字节作为标头值:

payload = {
#ommited for brevity
}

encoded_payload = str.encode(json.dumps(payload))
b64 = base64.b64encode(encoded_payload)

# sign the requests
signature = hmac.new(str.encode(keys['private']), b64, hashlib.sha384).hexdigest()

headers = {
        'Content-Type': 'text/plain',
        'APIKEY': keys['public'],
        'PAYLOAD': b64, // base64 value
        'SIGNATURE': signature
    }

async with aiohttp.request(method="POST", url="example.com", headers=headers) as response:
    print(await response.text())

但是,我收到错误:

  

追踪(最近一次通话):     文件" get_gem.py",第34行,in       loop.run_until_complete(get_gemini())     文件" /home/thorad/anaconda3/lib/python3.6/asyncio/base_events.py",第466行,在run_until_complete中       return future.result()     在get_gemini中输入文件" get_gem.py",第29行       异步与aiohttp.request(method =" POST",url = base_url + payload [" request"],headers = headers)作为响应:     文件" /home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/client.py" ;,第692行, aenter       self._resp =来自self._coro的收益率     文件" /home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/client.py" ;,第277行,在_request       resp = req.send(conn)     文件" /home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/client_reqrep.py" ;,第463行,发送       writer.write_headers(status_line,self.headers)     文件" /home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/http_writer.py" ;,第247行,在write_headers中       [k + SEP + v + END表示k,v表示headers.items()])     文件" /home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/http_writer.py" ;,第247行,在       [k + SEP + v + END表示k,v表示headers.items()])   TypeError:必须是str,而不是bytes

这表明我不能将字节作为标题发送。

不幸的是,我使用的服务要求我这样做,否则它会返回错误。

  • 我尝试删除'内容类型':' text / plain'

如何通过aiohttp将字节作为标头发送? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

这里的问题是b64encode返回字节,但可以很容易地将它们转换为正确的unicode字符串。它对您的服务器没有任何影响。

>>> b64 = base64.b64encode(b'...')
>>> type(b64)
<class 'bytes'>
>>> b64 = base64.b64encode(b'...').decode('utf8')
>>> type(b64)
<class 'str'>

答案 1 :(得分:0)

转换ascii中的有效内容:

payload = {
#ommited for brevity
}

encoded_payload = str.encode(json.dumps(payload))
b64 = base64.b64encode(encoded_payload)
b64 = b4.decode('ascii')  # conversion back to unicode

# sign the requests
signature = hmac.new(str.encode(keys['private']), b64, hashlib.sha384).hexdigest()

headers = {
        'Content-Type': 'text/plain',
        'APIKEY': keys['public'],
        'PAYLOAD': b64, // base64 value
        'SIGNATURE': signature
    }

async with aiohttp.request(method="POST", url="example.com", headers=headers) as response:
    print(await response.text())