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

时间:2010-11-16 06:04:35

标签: http rest post

我需要调用一个不需要用户输入的进程,只需要一个触发器。我计划在没有正文的情况下使用POST / uri来触发进程。我想知道从HTTP和REST角度来看这是否被认为是错误的?

6 个答案:

答案 0 :(得分:107)

几个月前,我在IETF HTTP工作组上问了this question。简短的回答是,是的,没关系,但我建议阅读该主题以获取更多细节。

答案 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

enter image description here