在没有实体主体的情况下执行HTTP POST是否被认为是不好的做法?


176

我需要调用一个过程,该过程不需要用户输入任何信息,而只是一个触发器。我计划在没有正文的情况下使用POST / uri来触发该过程。我想知道从HTTP和REST角度来看这是否不好?


6
感谢大家的建议。尽管每个人都提出了类似的建议,即可以零含量进行POST,但由于链接到IETF讨论,我选择Darrel的答案是正确的。讨论澄清了很多。
Suresh Kumar 2010年

Answers:




50

POST完全可以。与GET和POST不同的是,您正在更改系统状态(很可能您的触发器正在“执行”操作并更改数据)。

我已经使用了没有有效负载的POST,它“感觉”还可以。使用没有有效负载的POST时应该做的一件事:传递标头Content-Length: 0。我记得我的api客户端未通过代理时出现的一些代理问题。


16

如果您在没有主体的情况下使用POST / uri,则类似于使用不带参数的函数。因此,对您的资源类具有功能可以更改对象的状态而无需使用参数是合理的。如果您考虑为URI实现Unix touch功能,那不是一个好选择吗?


6
触摸/手指是本质上没有内容的非幂等动作的教科书插图。
克里斯·马里西克

2

是的,可以发送不带正文的POST请求,而使用查询字符串参数。但是要小心,如果您的参数包含不是HTTP有效的字符,则必须对其进行编码。

例如,如果您需要将“ hello world”发布到终点,则必须使它看起来像这样:http : //api.com?param= hello% 20world


0

对于在这种情况下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

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.