Подтвердить что ты не робот

Urllib2 и json

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

4b9b3361

Ответ 1

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

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

Ответ 2

Независимо от того, что 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()

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

Ответ 3

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

import json
import urllib2
data = json.dumps([1, 2, 3])
f = urllib2.urlopen(url, data)
response = f.read()
f.close()

Ответ 4

Чтобы прочитать ответ 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())

Ответ 5

Вы, конечно, хотите взломать заголовок, чтобы иметь правильный запрос 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.loads POST на серверной стороне.

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

Ответ 6

Это то, что сработало для меня:

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)