urllib2 и json - PullRequest
       7

urllib2 и json

69 голосов
/ 20 июля 2010

Может кто-нибудь указать учебник, который показывает мне, как сделать запрос POST, используя urllib2 с данными в формате JSON?

Ответы [ 6 ]

135 голосов
/ 15 февраля 2011

Ответ Мессы работает, только если сервер не потрудился проверить заголовок типа контента. Вам нужно будет указать заголовок типа контента, если вы хотите, чтобы он действительно работал. Вот ответ Мессы, модифицированный и включающий заголовок типа контента:

import json
import urllib2
data = json.dumps([1, 2, 3])
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
response = f.read()
f.close()
36 голосов
/ 30 сентября 2011

То, что urllib использует для определения Content-Length, кажется, запутано json, так что вы должны рассчитать это сами.

import json
import urllib2
data = json.dumps([1, 2, 3])
clen = len(data)
req = urllib2.Request(url, data, {'Content-Type': 'application/json', 'Content-Length': clen})
f = urllib2.urlopen(req)
response = f.read()
f.close()

У меня ушло навсегда, чтобы понять это, поэтому я надеюсь, что это поможет кому-то еще.

17 голосов
/ 20 июля 2010

Пример - отправка некоторых данных, закодированных как JSON, в качестве данных POST:

import json
import urllib2
data = json.dumps([1, 2, 3])
f = urllib2.urlopen(url, data)
response = f.read()
f.close()
5 голосов
/ 02 декабря 2011

Чтобы прочитать ответ JSON, используйте json.loads().Вот образец.

import json
import urllib
import urllib2

post_params = {
    'foo' : bar
}

params = urllib.urlencode(post_params)
response = urllib2.urlopen(url, params)
json_response = json.loads(response.read())
3 голосов
/ 09 ноября 2010

Вы, конечно, хотите взломать заголовок, чтобы получить правильный запрос Ajax:

headers = {'X_REQUESTED_WITH' :'XMLHttpRequest',
           'ACCEPT': 'application/json, text/javascript, */*; q=0.01',}
request = urllib2.Request(path, data, headers)
response = urllib2.urlopen(request).read()

И в json.load POST на стороне сервера.

Редактировать: Кстати, вы должны urllib.urlencode(mydata_dict) перед их отправкой. Если вы этого не сделаете, POST не будет соответствовать ожиданиям сервера

2 голосов
/ 13 сентября 2012

Вот что у меня сработало:

import json
import requests
url = 'http://xxx.com'
payload = {'param': '1', 'data': '2', 'field': '4'}
headers = {'content-type': 'application/json'}
r = requests.post(url, data = json.dumps(payload), headers = headers)
...