2017-12-26 40 views
3

나는 aiohttp 통해 헤더 값으로 바이트를 보내려고하고있다 : 나는 헤더로 바이트를 보낼 수 없습니다 제안Aiohttp : 헤더에서 바이트를 보내는 방법은 무엇입니까?

Traceback (most recent call last): File "get_gem.py", line 34, in loop.run_until_complete(get_gemini()) File "/home/thorad/anaconda3/lib/python3.6/asyncio/base_events.py", line 466, in run_until_complete return future.result() File "get_gem.py", line 29, in get_gemini async with aiohttp.request(method="POST", url=base_url + payload["request"], headers=headers) as response: File "/home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/client.py", line 692, in aenter self._resp = yield from self._coro File "/home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/client.py", line 277, in _request resp = req.send(conn) File "/home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/client_reqrep.py", line 463, in send writer.write_headers(status_line, self.headers) File "/home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/http_writer.py", line 247, in write_headers [k + SEP + v + END for k, v in headers.items()]) File "/home/thorad/anaconda3/lib/python3.6/site-packages/aiohttp/http_writer.py", line 247, in [k + SEP + v + END for k, v in headers.items()]) TypeError: must be str, not bytes

:

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()) 

는 그러나, 나는 오류가 발생합니다.

내가 사용하고있는 서비스에서 그렇게해야하거나 그렇지 않으면 오류가 반환됩니다.

  • 나는 '콘텐츠 유형을'제거 시도 : '텍스트/일반'

가 어떻게 aiohttp을 통해 헤더로 바이트를 보낼 수 있습니까? 도움 주셔서 감사합니다.

답변

3

여기서 문제는 b64encode이 바이트를 반환하지만 이는 올바른 유니 코드 문자열로 쉽게 변환 될 수 있다는 것입니다. 그것은 당신의 서버와 차이를 만들지 않을 것입니다.

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

아스키의 페이로드 변환 :

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())