【问题标题】:Is it considered bad practice to perform HTTP POST without entity body?在没有实体主体的情况下执行 HTTP POST 是否被认为是不好的做法?
【发布时间】:2011-05-10 15:32:12
【问题描述】:

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

【问题讨论】:

  • 感谢大家的建议。尽管每个人都给出了类似的建议,即可以发布零内容,但由于指向 IETF 讨论的链接,我选择 Darrel 的答案是正确的。讨论澄清了很多。

标签: http rest post


【解决方案1】:

在这种情况下 POST 可以的答案的支持是,在 Python 的情况下,OpenAPI 框架“FastAPI”在方法时生成一个不包含 Body 部分的 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

【讨论】:

    【解决方案2】:

    如果您使用没有正文的 POST /uri,则类似于使用不带参数的函数。例如 int post (void);因此,为您的资源类提供功能是合理的,它可以在没有参数的情况下更改对象的状态。如果考虑实现一个URI的Unix touch功能,是不是一个不错的选择?

    【讨论】:

    • 触摸/手指是一个教科书式的非幂等动作说明,它本质上是无内容的。
    • bool PullAndProcessNextJobFromQueue(void)
    【解决方案3】:

    是的,可以发送没有正文的 POST 请求,而是使用查询字符串参数。但要小心,如果您的参数包含非 HTTP 有效的字符,您将不得不对它们进行编码。

    例如,如果您需要 POST 'hello world' 到终点,您必须使其看起来像这样:http://api.com?param=hello%20world

    【讨论】:

      【解决方案4】:

      几个月前,我在 IETF HTTP 工作组上询问了this question。简短的回答是:不,这不是一个坏习惯(但我建议阅读该线程以获取更多详细信息)。

      【讨论】:

      • 任何更新的消息来源可以在 10 年后证实这一点?
      • 该死的,我误解了答案,因为双重否定@TripeHound,我删除了我的评论
      • @BaptistePernet RFC 7231 包含与链接线程中引用的版本基本相同的 POST 定义; RFC 引用了RFC 7230,其中提到了Content-Length例如,即使值为 0(表示有效负载正文为空),通常也会在 POST 请求中发送 Content-Length 标头字段。 ” 并没有警告不要这样做。两者都来自 2014 年,因此稍微更新,但似乎没有(相关)被取代(RFC 8615 似乎不适用)。
      【解决方案5】:

      POST 完全没问题。与 GET 和 POST 不同的是,您正在更改系统的状态(很可能您的触发器正在“做”某事并更改数据)。

      我已经在没有负载的情况下使用了 POST,它“感觉”还不错。使用不带负载的 POST 时应该做的一件事:传递标头 Content-Length: 0。当我 api-client 没有通过时,我记得一些代理的问题。

      【讨论】:

        【解决方案6】:

        使用 POST 而不是 GET 是完全合理的,因为它还指示服务器(以及沿途的网关)不要返回缓存的响应。

        【讨论】:

          猜你喜欢
          • 2022-01-17
          • 2022-12-22
          • 2011-02-12
          • 1970-01-01
          • 2018-07-03
          • 1970-01-01
          • 2013-10-27
          • 1970-01-01
          • 2015-10-20
          相关资源
          最近更新 更多