urllib2 y json

¿Alguien puede señalar un tutorial que me muestre cómo hacer una solicitud POST utilizando urllib2 con los datos en formato JSON?

La respuesta de Messa solo funciona si el servidor no se molesta en verificar el encabezado de tipo de contenido. Deberá especificar un encabezado de tipo de contenido si desea que realmente funcione. Aquí está la respuesta de Messa modificada para incluir un encabezado de tipo de contenido:

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

Lo que sea que use urllib para descubrir Content-Length parece confundirse con json, así que debes calcularlo tú mismo.

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

Me tomé para siempre resolver esto, así que espero que ayude a alguien más.

Ejemplo: enviar algunos datos codificados como JSON como datos POST:

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

Para leer la respuesta de json, use json.loads() . Aquí está la muestra.

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

Ciertamente, usted desea piratear el encabezado para tener una solicitud Ajax adecuada:

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

Y a json.loads el POST en el lado del servidor.

Edición: Por cierto, tienes que urllib.urlencode(mydata_dict) antes de enviarlos. Si no lo hace, el POST no será lo que el servidor espera

Esto es lo que funcionó para mí:

 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)