Ваш диагноз неверный; urllib2
будет отправить пустое тело POST в вашем случае:
>>> import urllib, urllib2
>>> url = 'http://httpbin.org/post?cid=42'
>>> headers = {
... 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36',
... 'X-CRFS-Token': 'csrf_token_mocked',
... 'X-Requested-With' : 'XMLHttpRequest'
... }
>>> values = {}
>>> data = urllib.urlencode(values)
>>> req = urllib2.Request(url, data, headers)
>>> req.has_data()
True
>>> req.get_method()
'POST'
>>> resp = urllib2.urlopen(req)
>>> body = resp.read()
>>> print body
{"args": {"cid": "42"}, "data": "", "files": {}, "form": {}, "headers": {"Accept-Encoding": "identity", "Connection": "close", "Content-Length": "0", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36", "X-Crfs-Token": "csrf_token_mocked", "X-Request-Id": "a14f84f5-a355-4b8a-8b34-cb42808b8b09", "X-Requested-With": "XMLHttpRequest"}, "json": null, "origin": "81.134.152.4", "url": "http://httpbin.org/post?cid=42"}
>>> from pprint import pprint
>>> import json
>>> pprint(json.loads(body))
{u'args': {u'cid': u'42'},
u'data': u'',
u'files': {},
u'form': {},
u'headers': {u'Accept-Encoding': u'identity',
u'Connection': u'close',
u'Content-Length': u'0',
u'Content-Type': u'application/x-www-form-urlencoded',
u'Host': u'httpbin.org',
u'User-Agent': u'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36',
u'X-Crfs-Token': u'csrf_token_mocked',
u'X-Request-Id': u'a14f84f5-a355-4b8a-8b34-cb42808b8b09',
u'X-Requested-With': u'XMLHttpRequest'},
u'json': None,
u'origin': u'81.134.152.4',
u'url': u'http://httpbin.org/post?cid=42'}
Некоторые вещи, чтобы отметить:
- http://httpbin.org/post маршрут принимает только методы POST; в противном случае он вернет ответ 405.
- Метод
req.get_method()
используется для определения способа использования при отправке запроса; вы можете увидеть, что он будет использовать POST
, хотя values
пуст. req.get_method()
определяет метод, используемый на основе ответа req.has_data()
, и , что метод возвращает True
, если атрибутом data
не является None
. Пустая строка квалифицируется здесь как имеющая данные.
- Ответ http://httpbin.org/post показывает заголовки запроса; заголовок длины содержимого был установлен в 0, указывая пустой корпус POST.
Итак, вопрос в следующем: насколько вы уверены, что у вас есть все необходимое для успешного завершения POST? Возможно, требуется заголовок Referer
, или, возможно, вы неправильно поняли, какие параметры переданы, а тело POST - , а не должно быть пустым.
Согласно [docs] (https://docs.python.org/3.0/library/urllib.request.html), urllib не предоставляет явный способ установки типа запроса. В нескольких местах он указывает, что тип запроса задается наличием или отсутствием данных: «Если URL использует идентификатор схемы http, необязательный аргумент данных может быть задан для указания запроса POST (обычно тип запроса GET) ._ " –
Что-то еще не так. Когда 'data' является пустой строкой, отправляется пустой орган POST. –
Я попробую с пустой строкой. –