¿Se considera una mala práctica realizar HTTP POST sin el cuerpo de la entidad?

177

Necesito invocar un proceso que no requiere ninguna entrada del usuario, solo un desencadenante. Planeo usar POST / uri sin un cuerpo para desencadenar el proceso. ¿Quiero saber si esto se considera malo desde las perspectivas HTTP y REST?

Suresh Kumar
fuente
66
Gracias a todos por vuestras sugerencias. Aunque todos dieron sugerencias similares, es decir, está bien PUBLICAR con contenido cero, estoy seleccionando la respuesta de Darrel como correcta debido al enlace a la discusión del IETF. La discusión aclara mucho.
Suresh Kumar

Respuestas:

155

Hice esta pregunta en el grupo de trabajo HTTP de IETF hace unos meses. La respuesta corta es: NO, no es una mala práctica (pero sugiero leer el hilo para más detalles).

Darrel Miller
fuente
44
¿Alguna fuente actualizada que confirme eso 10 años después?
Baptiste Pernet
79

Usar un POST en lugar de un GET es perfectamente razonable, ya que también le indica al servidor (y a las puertas de enlace) que no devuelva una respuesta almacenada en caché.

Adam Vandenberg
fuente
50

POST está completamente bien. A diferencia de GET with POST, está cambiando el estado del sistema (lo más probable es que su desencadenante esté "haciendo" algo y cambiando los datos).

Ya utilicé POST sin carga útil y "se siente" bien. Una cosa que debe hacer al usar POST sin carga útil: pasar el encabezado Content-Length: 0. Recuerdo problemas con algunos proxies cuando un cliente-API no lo pasó.

manuel aldana
fuente
16

Si usa POST / uri sin un cuerpo, es algo así como usar una función que no toma un argumento .eg int post (void); Por lo tanto, es razonable tener una función para su clase de recursos que puede cambiar el estado de un objeto sin tener un argumento. Si considera implementar la función táctil de Unix para un URI, ¿no es una buena opción?

yadab
fuente
66
Touch / finger es una ilustración de libro de texto de una acción no idempotente que es inherentemente sin contenido.
Chris Marisic
2

Sí, está bien enviar una solicitud POST sin cuerpo y, en su lugar, usar parámetros de cadena de consulta. Pero tenga cuidado si sus parámetros contienen caracteres que no son válidos para HTTP, tendrá que codificarlos.

Por ejemplo, si necesita POSTAR 'hello world' y punto final, deberá hacer que se vea así: http://api.com?param=hello%20world

marko982
fuente
0

El soporte para las respuestas de que POST está bien en este caso es que en el caso de Python, el marco OpenAPI "FastAPI" genera una GUI Swagger (ver imagen) que no contiene una sección Body cuando un método (ver ejemplo a continuación) no tener un parámetro para aceptar un cuerpo.

el método "post_disable_db" solo acepta un parámetro de ruta "db_name" y no tiene un segundo parámetro que implicaría un cuerpo obligatorio.

@router.post('/{db_name}/disable',
             status_code=HTTP_200_OK,
             response_model=ResponseSuccess,
             summary='',
             description=''
             )
async def post_disable_db(db_name: str):
    try:
        response: ResponseSuccess = Handlers.databases_handler.post_change_db_enabled_state(db_name, False)
    except HTTPException as e:
        raise (e)
    except Exception as e:
        logger.exception(f'Changing state of DB to enabled=False failed due to: {e.__repr__()}')
        raise HTTPException(HTTP_500_INTERNAL_SERVER_ERROR, detail=e.__repr__())

    return response

ingrese la descripción de la imagen aquí

RaamEE
fuente