2010-07-20 25 views
66

¿alguien puede indicarme un tutorial que me muestre cómo hacer una solicitud POST usando urllib2 con los datos en formato JSON?urllib2 y json

Respuesta

16

Ejemplo - el envío de 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() 
+3

Para muchos sistemas, esto no funcionará. Vea la respuesta de Bob Van Zant a continuación. – speedplane

2

Seguramente quiere cortar la cabecera para tener una adecuada Ajax Solicitud:

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 para json.loads el POST en el lado del servidor.

Editar: Por cierto, usted tiene que urllib.urlencode(mydata_dict) antes de enviarlos. Si no lo hace, el POST no será lo que espera el servidor

+0

urlencode enviará datos codificados en formato url, no en json. – kolinko

124

La respuesta de Messa solo funciona si el servidor no se molesta en verificar el encabezado de tipo de contenido. Tendrá que especificar un encabezado de tipo de contenido si quiere que realmente funcione. Aquí está la respuesta de Messa modificado 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() 
+1

Trabajando con python3 y urllib, adicionalmente tuve que codificar mis datos de análisis json para que esto funcione 'data = json.dumps ([1, 2, 3]). Encode (" utf8) '. Ver http: // stackoverflow.com/a/5441022/3757139 – Samuel

30

Cualquiera que sea urllib está usando para averiguar Content-Length parece confundirse con JSON, así que hay que calcular que usted 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ó por siempre para resolver esto, así que espero que ayude a alguien más.

+1

Muchas gracias por esto !! 5 años después y esto todavía está roto! – GuyMatz

+1

Puedo verificar que al menos en versiones anteriores de Python (específicamente 2.6) nada funcionará a menos que configure Content- ¡Longitud como en esta respuesta! – Wingware

6

Para leer la respuesta 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()) 
+1

Esto no envía JSON, solo lo recibe. – tsturzl

1

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) 
+6

No creo que el paquete de solicitudes sea parte de la biblioteca estándar. –

+0

Aunque el paquete 'requests' no es parte de la lib estándar, se instala fácilmente utilizando pip. Perfecto para quienes trabajan en un entorno virtual. – Will