es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer una respuesta POST en Python

Actualmente estoy creando una interfaz de línea de comandos que tiene comandos para interactuar con puntos finales de la API que se encuentran en mi servidor web Flask que se está ejecutando en mi host local. Estoy usando Click como marco de mi CLI.

Algunos de mis puntos finales solo aceptan métodos GET, mientras que uno acepta GET, POST, PUT, DELETE. Entiendo cómo hacer los puntos finales que solo usan los métodos GET. Un ejemplo de mi código a continuación:

@cli.command()
@click.argument(‘arg’)
def factorial(arg):
r = requests.get(‘http://localhost:80/factorial/{}’.format(arg)).json()
print(‘input: {}, output: {}’.format(r[‘input’], r[‘output’]))

Esto funciona muy bien. Sin embargo, tengo un punto final keyval al que me gustaría enviar datos JSON mediante POST. También me gustaría poder POST, PUT y DELETE en este punto final. Pero no estoy seguro de cómo hacerlo correctamente. Sé cómo usar curl para enviar datos a este punto final, por ejemplo:

curl -X POST http://localhost:80/keyval -H ‘Content-Type: application/json’ -d ‘{“key”:”1″,”value”:”2″}’

Estoy tratando de implementar esta lógica en un argumento de línea de comandos de Click. Como lo hace mi primer ejemplo de código con GET, pero con funcionalidad POST.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la funcionalidad POST en la interfaz de línea de comandos, puede usar el método “requests.post” de la biblioteca “requests”. Aquí hay un ejemplo de cómo modificar el comando “keyval” para permitir solicitudes POST con datos JSON:

    @cli.command()
    @click.option('--key', prompt=True, help='La clave para la entrada keyval.')
    @click.option('--value', prompt=True, help='El valor para la entrada keyval.')
    @click.option('--method', type=click.Choice(['GET', 'POST', 'PUT', 'DELETE']), default='GET', help='El método HTTP a utilizar.')
    def keyval(key, value, method):
        url = 'http://localhost:80/keyval'
        if method == 'GET':
            r = requests.get('{}?key={}'.format(url, key)).json()
            print('clave: {}, valor: {}'.format(r['key'], r['value']))
        elif method == 'POST':
            payload = {'key': key, 'value': value}
            headers = {'Content-Type': 'application/json'}
            r = requests.post(url, data=json.dumps(payload), headers=headers)
            print('Par clave-valor agregado correctamente.')
        elif method == 'PUT':
            payload = {'key': key, 'value': value}
            headers = {'Content-Type': 'application/json'}
            r = requests.put(url, data=json.dumps(payload), headers=headers)
            print('Par clave-valor actualizado correctamente.')
        elif method == 'DELETE':
            r = requests.delete('{}?key={}'.format(url, key))
            print('Par clave-valor eliminado correctamente.')
    

    Esto modifica el comando “keyval” para que incluya la opción “–method”, lo que permite al usuario elegir el método HTTP a utilizar. Si el usuario elige “POST”, la función crea un payload JSON con las opciones “key” y “value” enviadas, establece el encabezado “Content-Type” en “application/json” y envía la solicitud utilizando el método “requests.post”. La función luego imprime un mensaje de éxito indicando que el par clave-valor se agregó correctamente.

    Para modificar la función y manejar los métodos “PUT” y “DELETE”, seguiría un patrón similar, utilizando los métodos “requests.put” y “requests.delete”, respectivamente.

Comments are closed.