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