我需要调用一个不需要用户输入的进程,只需要一个触发器。我计划在没有正文的情况下使用POST / uri来触发进程。我想知道从HTTP和REST角度来看这是否被认为是错误的?
答案 0 :(得分:107)
答案 1 :(得分:66)
使用POST而不是GET是完全合理的,因为它还指示服务器(以及沿途的网关)不返回缓存的响应。
答案 2 :(得分:41)
POST完全没问题。不同于GET和POST,你正在改变系统的状态(很可能你的触发器是“做”某事和改变数据)。
我已经在没有有效载荷的情况下使用了POST,它“感觉”很好。使用不带有效负载的POST时应该做的一件事:传递头Content-Length: 0
。当我api-client没有通过它时,我记得一些代理的问题。
答案 3 :(得分:14)
如果你使用没有正文的POST / uri就像使用一个不带参数的函数.e.g int post(void);因此,为资源类提供函数是合理的,它可以在没有参数的情况下更改对象的状态。如果你考虑为URI实现Unix touch功能,那不是一个好的选择吗?
答案 4 :(得分:0)
是的,可以发送不带正文的POST请求,而使用查询字符串参数。但是请注意,如果您的参数包含不是HTTP有效的字符,则必须对其进行编码。
例如,如果需要将“ hello world”发布到终点,则必须使它看起来像这样:http://api.com?param=hello%20world
答案 5 :(得分:0)
对于在这种情况下POST可以回答的答案的支持是,在Python的情况下,OpenAPI框架“ FastAPI”会生成一个Swagger GUI(参见图),该方法在方法时不包含Body部分(请参见下面的示例)没有可以接受主体的参数。
“ 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