【发布时间】:2011-05-10 15:32:12
【问题描述】:
我需要调用一个不需要用户输入的进程,只需要一个触发器。我计划使用没有正文的 POST /uri 来触发该过程。我想知道从 HTTP 和 REST 的角度来看这是否被认为是不好的?
【问题讨论】:
-
感谢大家的建议。尽管每个人都给出了类似的建议,即可以发布零内容,但由于指向 IETF 讨论的链接,我选择 Darrel 的答案是正确的。讨论澄清了很多。
我需要调用一个不需要用户输入的进程,只需要一个触发器。我计划使用没有正文的 POST /uri 来触发该过程。我想知道从 HTTP 和 REST 的角度来看这是否被认为是不好的?
【问题讨论】:
在这种情况下 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
【讨论】:
如果您使用没有正文的 POST /uri,则类似于使用不带参数的函数。例如 int post (void);因此,为您的资源类提供功能是合理的,它可以在没有参数的情况下更改对象的状态。如果考虑实现一个URI的Unix touch功能,是不是一个不错的选择?
【讨论】:
bool PullAndProcessNextJobFromQueue(void)
是的,可以发送没有正文的 POST 请求,而是使用查询字符串参数。但要小心,如果您的参数包含非 HTTP 有效的字符,您将不得不对它们进行编码。
例如,如果您需要 POST 'hello world' 到终点,您必须使其看起来像这样:http://api.com?param=hello%20world
【讨论】:
几个月前,我在 IETF HTTP 工作组上询问了this question。简短的回答是:不,这不是一个坏习惯(但我建议阅读该线程以获取更多详细信息)。
POST 完全没问题。与 GET 和 POST 不同的是,您正在更改系统的状态(很可能您的触发器正在“做”某事并更改数据)。
我已经在没有负载的情况下使用了 POST,它“感觉”还不错。使用不带负载的 POST 时应该做的一件事:传递标头 Content-Length: 0。当我 api-client 没有通过时,我记得一些代理的问题。
【讨论】:
使用 POST 而不是 GET 是完全合理的,因为它还指示服务器(以及沿途的网关)不要返回缓存的响应。
【讨论】: