¿Cómo enviar una solicitud POST?

Encontré este script en línea:

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 qué es todo lo que está dentro de la variable params o cómo usarlo. ¿Puedo tener un poco de ayuda para tratar de hacer que esto funcione?

preguntado el 04 de julio de 12 a las 05:07

La solicitud de publicación es solo una solicitud de publicación, independientemente de lo que haya en el lado del servidor. -

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

Este script no parece compatible con python3.2 -

El equivalente de python3 de este ejemplo podría ser: pastebin.com/Rx4yfknM -

Lo que sugeriré es instalar Firefox live http header addon y luego abra su url en firefox y vea el request/response de URL en live http header addon entonces entenderás lo que params and headers hacer en su código. -

7 Respuestas

Si realmente quieres manejar HTTP usando Python, te recomiendo encarecidamente Solicitudes: HTTP para humanos. El inicio rápido POST adaptado 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...
>>> 

respondido 10 mar '20, 19:03

No puedo obtener el mismo resultado que obtuviste anteriormente. Escribí otro número de problema en la página y luego ejecuté el script, pero no pude ver el número de problema en el resultado. - Efe Buyuk

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

¿Cómo obtener el resultado json? - Yohanim

Si necesita enviar un objeto JSON, debe hacer: json={'number': 12524... en lugar de data=... - Estarán

¿Por qué la respuesta dice "Si realmente quieres manejar HTTP usando Python"? ¿Es una mala idea manejar solicitudes HTTP? si es así, ¿por qué? ¿alguien puede explicar por favor? - Jan Piss

Esta es una solución sin dependencias pip externas, pero solo funciona en Python 3+ (Python 2 no funcionará):

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)

Muestra 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"
}

Respondido 16 Abr '21, 19:04

No puede lograr solicitudes POST usando urllib (solo para GET), en su lugar intente 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))

Respondido el 22 de junio de 17 a las 22:06

Gracias. data=json.dumps(payload) es la clave para mi caso de uso - Aram

Utiliza la requests biblioteca para GET, POST, PUT o DELETE presionando un punto final de API REST. Pase la URL del punto final de API restante en url, carga útil (dict) en data y encabezado/metadatos en headers

import requests, json

url = "bugs.python.org"

payload = {"number": 12524, 
           "type": "issue", 
           "action": "show"}

header = {"Content-type": "application/x-www-form-urlencoded",
          "Accept": "text/plain"} 

response_decoded_json = requests.post(url, data=payload, headers=header)
response_json = response_decoded_json.json()
 
print(response_json)

Respondido 16 Abr '21, 18:04

Este código tiene problemas con la sangría y el nombre del parámetro del encabezado. - xilopintura

headers el parámetro es incorrecto y tampoco tenemos ningún json aquí. Deberíamos usar json.dumps(pauload) - Arash Hatami

Gracias @xilopaint y ArashHatami por el error de sintaxis. Corregido ahora. - Pranzell

Su diccionario de datos contiene nombres de campos de entrada de formulario, simplemente mantenga sus valores a la derecha para encontrar resultados. vista de formulario El encabezado configura el navegador para recuperar el tipo de datos que declaras. Con la biblioteca de solicitudes, es fácil enviar POST:

import requests

url = "https://bugs.python.org"
data = {'@number': 12524, '@type': 'issue', '@action': 'show'}
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept":"text/plain"}
response = requests.post(url, data=data, headers=headers)

print(response.text)

Más sobre el objeto Solicitud: https://requests.readthedocs.io/en/master/api/

Respondido el 20 de enero de 20 a las 14:01

Si no desea usar un módulo, debe instalarlo como requests, y su caso de uso es muy básico, entonces puede usar urllib2

urllib2.urlopen(url, body)

Consulte la documentación para urllib2 aquí: https://docs.python.org/2/library/urllib2.html.

Respondido el 17 de enero de 19 a las 20:01

Puede utilizar la biblioteca de solicitudes para realizar una solicitud posterior. Si tiene una cadena JSON en la carga útil, puede usar json.dumps (carga útil), que es la forma esperada de la carga útil.


    import requests, json
    url = "http://bugs.python.org/test"
    payload={
        "data1":1234,'data2':'test'
    }
    headers = {
        'Content-Type': 'application/json'
    }
    response = requests.post(url, headers=headers, data=json.dumps(payload))
    print(response.text , response.status_code)

Respondido el 15 de Septiembre de 21 a las 15:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.