我需要调用一个过程,该过程不需要用户输入任何信息,而只是一个触发器。我计划在没有正文的情况下使用POST / uri来触发该过程。我想知道从HTTP和REST角度来看这是否不好?
我需要调用一个过程,该过程不需要用户输入任何信息,而只是一个触发器。我计划在没有正文的情况下使用POST / uri来触发该过程。我想知道从HTTP和REST角度来看这是否不好?
Answers:
几个月前,我在IETF HTTP工作组上提出了这个问题。简短的答案是:不,这不是一个坏习惯(但我建议阅读线程以获取更多详细信息)。
使用POST而不是GET是完全合理的,因为它还会指示服务器(以及沿途的网关)不返回缓存的响应。
是的,可以发送不带正文的POST请求,而使用查询字符串参数。但是要小心,如果您的参数包含不是HTTP有效的字符,则必须对其进行编码。
例如,如果您需要将“ hello world”发布到终点,则必须使它看起来像这样:http : //api.com?param= hello% 20world
对于在这种情况下POST可以回答的答案的支持是,在Python的情况下,OpenAPI框架“ FastAPI”会生成一个Swagger GUI(参见图),而当方法(参见以下示例)不包含主体部分时,具有接受实体的参数。
方法“ post_disable_db”仅接受路径参数“ db_name”,而没有第二个参数,这暗示着强制性主体。
@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