Actualmente estoy trabajando con un código escrito por otra persona. Utiliza httplib
para realizar solicitudes al servidor. Tiene todos los datos proporcionados en un formato correcto, por ejemplo cuerpo de mensaje, valores de encabezado, etc.Python httplib y POST
El problema es que cada vez que intenta enviar una solicitud POST, la información está allí - Puedo verla en el lado del cliente, sin embargo, nada llega al servidor. He leído las especificaciones de la biblioteca y el uso parece ser correcto.
Las llamadas a las bibliotecas extraídos ser la siguiente:
import httplib
conn = httplib.HTTPConnection('monkeylabs.pl', 80)
conn.connect()
request = conn.putrequest('POST', '/api/snippet/')
headers = {}
headers['Content-Type'] = 'application/json'
headers['User-Agent'] = 'Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03'
headers['Accept'] = '*/*'
for k in headers:
conn.putheader(k, headers[k])
conn.endheaders()
conn.send('[{"id":"route"}]')
resp = conn.getresponse()
print resp.status
print resp.reason
print resp.read()
conn.close()
Es esto algún problema conocido, o qué? Estoy usando Python 2.7. No estoy seguro de cómo verificar la versión de httplib.
Por favor no sugiera intercambiar httplib por otra cosa a menos que sea algo realmente similar (httplib2 quizás). Como dije, el código no es mío y viene en cantidades mucho mayores que las que acabo de publicar. Refactorizarlo causaría un problema importante. Estoy interesado en cualquier solución alternativa confiable.
EDITAR
El resultado de la depuración:
send: 'POST /api/snippet/ HTTP/1.1\r\nHost: monkeylabs.pl\r\nAccept-Encoding: identity\r\nContent-Type: application/json\r\nAccept: */*\r\nUser-Agent: Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03\r\n\r\n[{"id":"route"}]'
reply: 'HTTP/1.0 201 CREATED\r\n'
header: Date: Fri, 10 Jun 2011 23:54:00 GMT
header: Server: WSGIServer/0.1 Python/2.7.1+
header: Vary: Cookie
header: Content-Type: application/json
header: Content-Length: 0
201
CREATED
Tenga en cuenta que la información después de respuesta en realidad habla sobre la respuesta del servidor, no la propia solicitud, que en este caso está vacía. La causa principal es que el cuerpo de la petición en sí es vacío, que puedo observar al obtener un registro:
[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0
Y esas tres líneas:
``
<QueryDict: {}>
<QueryDict: {}>
de:
print '`%s`' % request.raw_post_data
print request.GET
print request.POST
en el servidor Django. Parece que intenta enviar el cuerpo pero no lo envía al final.
EDITAR (2)
Ok, me tomó un basurero y que de hecho me dijeron que en el mensaje enviado desde el navegador hay un parámetro adicional denominado 'Content-Length' que se ha omitido en el uso regular de la biblioteca. Tonto de mí.
Por cierto, si usted piensa que va a depurando esta cosa mucho, instalar [Wireshark] (http://www.wireshark.org/) y lo usa para espiar lo que está pasando por el cable. – Darien
Gracias, al principio no era creyente, pero en realidad me condujo a la solución. Gracias de nuevo – julkiewicz
El servidor tiene: response.set_header ('Access-Control-Allow-Origin', '*') ???? –