我需要使用grequests進行異步POST請求。使用grequests發佈json數據?
我的身體後(以JSON),是這樣的:
[{'params': {'source': 'widget',
'id': 'http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif',
'groupId': '@self',
'nolog': 'true',
'userId': '@viewer'},
'method': 'pos.plusones.get',
'id': 'p',
'jsonrpc': '2.0',
'apiVersion': 'v1',
'key': 'p'}]
我需要[0]['params']['id']
鍵的值更改爲不同的URL的很多帖子,我會做。
所以我做:
myrequests = (grequests.post(POST_URL, data=fgp(a_url) for a_url in all_urls)
在我的理解產生的fgp()
方法是改變[0]['params']['id']
到a_url
傳遞給它,在POST身體我送的方法。
當我映射請求的響應:
myresponses = grequests.map(myrequests)
這是我得到的,因爲很多時候,因爲有請求(明顯)。
Traceback (most recent call last):
File "/home/ashk/.virtualenvs/cosignp3/src/gevent/gevent/greenlet.py", line 340, in run
result = self._run(*self.args, **self.kwargs)
File "/home/ashk/.virtualenvs/cosignp3/lib/python3.4/site-packages/grequests.py", line 71, in send
self.url, **merged_kwargs)
File "/home/ashk/.virtualenvs/cosignp3/lib/python3.4/site-packages/requests/sessions.py", line 451, in request
prep = self.prepare_request(req)
File "/home/ashk/.virtualenvs/cosignp3/lib/python3.4/site-packages/requests/sessions.py", line 382, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/home/ashk/.virtualenvs/cosignp3/lib/python3.4/site-packages/requests/models.py", line 307, in prepare
self.prepare_body(data, files, json)
File "/home/ashk/.virtualenvs/cosignp3/lib/python3.4/site-packages/requests/models.py", line 456, in prepare_body
body = self._encode_params(data)
File "/home/ashk/.virtualenvs/cosignp3/lib/python3.4/site-packages/requests/models.py", line 89, in _encode_params
for k, vs in to_key_val_list(data):
ValueError: too many values to unpack (expected 2)
<Greenlet at 0x7f0f7cbf33d8: <bound method AsyncRequest.send of <grequests.AsyncRequest object at 0x7f0f7c90d080>>(stream=False)> failed with ValueError
編輯:問題解決: -
我得打轉轉,並放在頭就像你的requests
模塊中。
我設置標題kwarg參數進行編碼沒有,內容類型:
(grequests.post(POST_URL, data=fgp(a_url, j=True), headers={'Accept-Encoding':'none', 'Content-Type':'application/json'}) for a_url in urls)
現在我得到正確的輸出:
In [64]: resps[0].json()
Out[64]:
{'result': {'isSetByViewer': False,
'kind': 'pos#plusones',
'metadata': {'type': 'URL', 'globalCounts': {'count': 0.0 }},
'id': 'http://example.com/dfg',
'abtk': 'xxxxxxxxxxxxxxx'},
'id': 'p'}
注:輸出編輯一點點隱藏一些數據。
那麼,你的數據進行編碼,以JSON? –
@MartijnPieters哦,是的。謝謝。那就是問題所在。但現在我的問題是,我得到了像'07 \ x04 \ xc3'pO \ x01 \ x00 \ x00''這樣的字節響應體。我如何將Content-Type頭設置爲'application/json'來獲得正確的響應? –
聽起來像服務器正在給你一個不好的迴應;壓縮但沒有標題告訴你。您可以在會話中設置額外的「Accept-Encoding」標頭。 –