web-dev-qa-db-fra.com

urllib2 et json

quelqu'un peut-il signaler un tutoriel qui me montre comment faire une demande POST en utilisant urllib2 avec les données au format JSON?

69
pup

La réponse de Messa ne fonctionne que si le serveur ne veut pas vérifier l'en-tête de type de contenu. Vous devrez spécifier un en-tête de type de contenu si vous voulez que cela fonctionne vraiment. Voici la réponse de Messa modifiée pour inclure un en-tête de type de contenu:

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()
135
Bob Van Zant

Tout ce que urllib utilise pour déterminer Content-Length semble dérouté par json, vous devez donc le calculer vous-même.

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

Cela m’a pris pour toujours, alors j’espère que cela aidera quelqu'un d’autre.

36
CloudMarc

Exemple - envoi de données encodées au format JSON en tant que données POST:

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

Pour lire la réponse JSON, utilisez json.loads(). Voici l'échantillon.

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
eseceve

Vous voulez certainement pirater l'en-tête pour avoir une requête Ajax appropriée:

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

Et json.loads le POST sur le serveur.

Edit: Au fait, vous devez urllib.urlencode(mydata_dict) avant de les envoyer. Si vous ne le faites pas, le POST ne sera pas ce que le serveur attend

3
Stan

C'est ce qui a fonctionné pour moi:

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)
2
arcana