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?
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?
Respuestas:
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).
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é.
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ó.
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?
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
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