正确的RESTful方式来处理不是真正创建或获取内容的请求?

正确的RESTful方式来处理不是真正创建或获取内容的请求?,rest,Rest,我正在编写一个小应用程序,它只做一件事:获取一些用户提供的数据,对其进行一些分析,然后为这些数据返回一个“标记”。我认为客户应该获取或者将他们的请求发布到/getTag,以便获得回复 当客户端执行此操作时,服务器上没有存储任何内容,因此使用POST感觉很奇怪。但是,分析也没有统一的URI,因此使用GET感觉很奇怪,因为它将根据提供的数据返回不同的内容 用REST表示此功能的最佳方式是什么?POST可以表示执行某个操作。该操作不必是数据库操作 您真正创建的是一个远程过程。RPC通常都是POST。我

我正在编写一个小应用程序,它只做一件事:获取一些用户提供的数据,对其进行一些分析,然后为这些数据返回一个“标记”。我认为客户应该
获取
或者
将他们的请求发布到
/getTag
,以便获得回复

当客户端执行此操作时,服务器上没有存储任何内容,因此使用POST感觉很奇怪。但是,分析也没有统一的URI,因此使用GET感觉很奇怪,因为它将根据提供的数据返回不同的内容


用REST表示此功能的最佳方式是什么?

POST可以表示执行某个操作。该操作不必是数据库操作

您真正创建的是一个远程过程。RPC通常都是POST。我认为这不适合REST,但这并不一定会阻止您使用简单的URL和JSON

最好的方法是做最适合您的应用程序及其需求的事情。不知道这一点,以下是一些想法:

  • GET
    是最合适的动词,因为您不是在服务器上创建或存储任何内容,而是检索服务器提供的内容

  • 不要像你建议的那样在URI中添加单词
    get
    。HTTP已经提供了类似的动词,所以只需使用
    /tag
    GET
    即可

  • 您应该对此资源使用一个易于理解的(或“酷”)URI,并将数据作为查询参数传递。我不担心会觉得奇怪(请参阅答案以了解原因)


  • 总而言之,只要
    /tag?foo=bar&beef=dead
    上获取
    ,您就完成了。

    在我看来,您或生成原始数据的用户可能会希望生成的标记保持不变,不是吗

    如果有可能的话,那么我将把它写为
    POST/tags
    ,并将
    /tags/:id
    资源URI作为Location:header传回


    如果我真的不关心持久化生成的标记,我会考虑“用户生成的数据”是什么,以及在幕后进行了多少处理。如果“标记”与传递到系统中的任何数据都有足够的不同,那么对于API消费者来说,
    GET/tag
    可能会让人困惑。

    我支持Brian的回答:使用
    GET
    。如果相同的输入参数返回相同的输出,并且您没有真正创建任何内容,那么这是一个幂等操作,因此非常适合
    GET

    您可以使用
    GET
    POST

    • GET/tag?data=“…”->200,tag

      GET方法意味着检索任何信息(以 实体)由请求URI标识。如果请求URI引用 一个数据生成过程,它是生成的数据 作为响应中的实体返回,而不是 进程,除非该文本恰好是进程的输出

    • POST/tag{data:“…”}->200,tag

      POST方法执行的操作可能不会生成资源 可以由URI标识的。在这种情况下,200(正常)或204 (无内容)是适当的响应状态,具体取决于 响应是否包含描述结果的实体

    根据HTTP标准/章节

    如果我是你,我会使用
    GET
    (如果你想发送文件,我会使用
    POST