2012-07-04 45 views
134

He encontrado esta secuencia de comandos en línea:¿Cómo enviar la solicitud POST?

import httplib, urllib 
params = urllib.urlencode({'number': 12524, 'type': 'issue', 'action': 'show'}) 
headers = {"Content-type": "application/x-www-form-urlencoded", 
      "Accept": "text/plain"} 
conn = httplib.HTTPConnection("bugs.python.org") 
conn.request("POST", "", params, headers) 
response = conn.getresponse() 
print response.status, response.reason 
302 Found 
data = response.read() 
data 
'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>' 
conn.close() 

Pero no entiendo cómo usarlo con PHP o lo que todo dentro de la variable params es o cómo usarlo. ¿Puedo por favor tener un poco de ayuda tratando de hacer que esto funcione?

+1

La solicitud de publicación es solo una solicitud posterior, independientemente de lo que ocurra en el servidor. –

+7

Esto envía una solicitud POST. Luego, el servidor responde con 302 (redirigir) encabezados a su POST. ¿Qué está realmente mal? – ddinchev

+1

Este script no se parece a python3.2 compat – jdi

Respuesta

214

Si realmente desea manejar con HTTP usando Python, recomiendo encarecidamente Requests: HTTP for Humans. El POST quickstart adaptada a su pregunta es:

>>> import requests 
>>> r = requests.post("http://bugs.python.org", data={'number': 12524, 'type': 'issue', 'action': 'show'}) 
>>> print(r.status_code, r.reason) 
200 OK 
>>> print(r.text[:300] + '...') 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<title> 
Issue 12524: change httplib docs POST example - Python tracker 

</title> 
<link rel="shortcut i... 
>>> 
+0

No puedo obtener el mismo resultado que el anterior. Escribí otro número de problema en la página y luego ejecuté el script, pero no pude ver el número del problema en el resultado. –

+1

Cambie data = {'number': 12524, para leer data = {'number': '12524' ,. Lo habría cambiado yo mismo, pero las ediciones deben tener más de 6 caracteres. Gracias – kevthanewversi

+0

para el registro: un código de trabajo recientemente para mí, data = {'@ number': '12524', '@type': 'issue', '@action': 'show'} – marr

15

No se puede lograr mediante solicitudes POST urllib (sólo para GET), en lugar de tratar de usar requests módulo, por ejemplo:

Ejemplo 1.0:

import requests 

base_url="www.server.com" 
final_url="/{0}/friendly/{1}/url".format(base_url,any_value_here) 

payload = {'number': 2, 'value': 1} 
response = requests.post(final_url, data=payload) 

print(response.text) #TEXT/HTML 
print(response.status_code, response.reason) #HTTP 

Ejemplo 1.2:

>>> import requests 

>>> payload = {'key1': 'value1', 'key2': 'value2'} 

>>> r = requests.post("http://httpbin.org/post", data=payload) 
>>> print(r.text) 
{ 
    ... 
    "form": { 
    "key2": "value2", 
    "key1": "value1" 
    }, 
    ... 
} 

Ejemplo 1.3:

>>> import json 

>>> url = 'https://api.github.com/some/endpoint' 
>>> payload = {'some': 'data'} 

>>> r = requests.post(url, data=json.dumps(payload)) 
81

Si necesita que su secuencia de comandos para ser portátil y que preferiría no tener ninguna dependencia de 3 ª parte, esta es la forma de enviar solicitud POST puramente en Python 3.

from urllib.parse import urlencode 
from urllib.request import Request, urlopen 

url = 'https://httpbin.org/post' # Set destination URL here 
post_fields = {'foo': 'bar'}  # Set POST fields here 

request = Request(url, urlencode(post_fields).encode()) 
json = urlopen(request).read().decode() 
print(json) 

Ejemplo de salida:

{ 
    "args": {}, 
    "data": "", 
    "files": {}, 
    "form": { 
    "foo": "bar" 
    }, 
    "headers": { 
    "Accept-Encoding": "identity", 
    "Content-Length": "7", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.3" 
    }, 
    "json": null, 
    "origin": "127.0.0.1", 
    "url": "https://httpbin.org/post" 
} 
+6

Este código solo funcionará en Python 3, como dije en la respuesta. – stil

Cuestiones relacionadas