REST对我的应用程序来说是一个好的解决方案吗?-(一个有许多动作的系统)



我正在启动一个新项目,我试图弄清楚我是否应该遵循RESTful方法。通过阅读互联网上的不同来源,我越来越困惑于真正的RESTful方法应该是什么。有些人说REST请求(即URI和HTTP请求的其余内容)永远不应该用HTTP动词以外的东西来描述操作。还有一些人说,由于HTTP谓词是有限的,HTTP请求主体可以提供关于需要对URI描述的数据应用哪个操作的附加信息两者中哪一个是正确的我将为您简要描述我正在尝试构建的软件,以及我认为它应该如何使用REST实现:用户必须能够在服务器上上传/删除/编辑数据。然后,他必须能够以作业的形式在服务器上执行10种不同的分析(analysis01-analysis10)。因此,用户将向服务器提交作业。作业完成后,用户将能够获得分析结果。以下是我认为在REST中实现这一点的正确方法:

数据集:

POST /datasets/     - To create/upload a new dataset
GET /datasets/      - To get a list of all the available datasets.
GET /datasets/01    - To get info about dataset 01
DELETE /datasets/01 - To delete dataset 01

工作:

POST /analysis01_jobs/     - Submit a new job for analysis01
GET /analysis01_jobs/      - Get a list with all the submitted analysis01 jobs
GET /analysis10_jobs/      - Get a list with all the submitted analysis10 jobs
GET /analysis01_jobs/01    - Get the status of job '01' which performs analysis of type 01
DELETE /analysis10_jobs/01 - Delete/Cancel job '01' which performs analysis of type 10

正如您所看到的,每种类型的分析都有不同的作业REST URL路径。我想改变这一点,将所有作业放在同一路径下:"/analysis_jobs/",并在HTTP标头中指定我想要的分析类型。但这将意味着我希望服务器执行的操作类型。因此,这不再是RESTful对还是错

当一个作业完成时,它将产生一个"结果"资源。因此,这方面的REST API将是这样的:

- There is no POST here because only the job that runs on the server can generate results.
GET /analysis01_results/      - To get a list of all the available results from analysis01 jobs
GET /analysis01_results/01    - To get the results of a job that performed analysis of type 01. The body of the HTTP response will also contain info about the "parent" job and data.
DELETE /analysis01_results/01 - To delete the above results.

上面的设计是RESTful的吗

提前谢谢!

REST是关于机器到机器的通信。如果您至少没有两个不同的客户端,我认为实现REST服务是不值得的。

有些人说REST请求(即URI和HTTP请求的其余内容)永远不应该用HTTP动词以外的东西来描述操作。还有一些人说,由于HTTP谓词是有限的,HTTP请求主体可以提供关于需要对URI描述的数据应用哪个操作的附加信息。这两者中哪一个是正确的?

你应该阅读菲尔丁的论文,它是唯一真正的知识来源D

两者都可能是错误的。第二个更接近事实。如果您需要描述一个新的操作,您可以始终定义一个新资源,并将其与现有的HTTP谓词一起使用。例如,CCD_ 1可以用CCD_ 2来描述。

请注意,我们在这里谈论的是超链接:

POST /datasets/ - To create/upload a new dataset

这是一个操作,但在/datasets/的表示中也是一个超链接,您可以使用GET /datasets/访问它。您可以添加到主体中的是To create/upload a new dataset部分,因此客户端不需要了解任何关于URI结构的信息就可以了解链接的作用。

{
    href: "/datasets/",
    method: "POST", 
    rel: "/docs/datasets/create"
}

您可以使用GET /docs/datasets/create访问表单描述。(目前,ppl正在开发一种标准格式来描述这些描述,例如RDF+Hydra。但目前还没有准备好生产。)

Ofc。如果需要,可以扩展描述:

{
    href: "/datasets/",
    method: "POST", 
    rel: "/docs/datasets/create",
    label: "Create a new dataset",
    description: "You can create a new dataset by sending this form.",
    fields: {
        label: {
            type: "string", 
            label: "Title", 
            description: "You can give a title to the dataset here.",
            ...
        },
        records: {
            type: "array", 
            ...
        }
    }
}

但是,如果您在文档文件中描述所有内容,那么生成文档会更容易,对于REST客户端,可能是在JSON-LD中描述,对于客户端的第三方开发人员,则可能是在HTML中描述。

POST/analysis01_jobs/-提交一个新作业进行分析01

GET/analysis01_results/-从analysis01作业获取所有可用结果的列表

GET/analysis01_results/01-获取执行01类型分析的作业的结果。HTTP响应的主体还将包含关于";"父";作业和数据。

我宁愿使用

  • POST /jobs/ {analysis: {id: "01"}}
  • GET /analysis/01/jobs
  • ANALYZE /datasets/10

你正朝着正确的方向前进,但你仍然可以缓和它。

1-

REST对我的应用程序来说是一个好的解决方案吗?

是的,你可以比较一下。这个问题上的REST与SOAP

2-

使用PUT来创建或添加资源或作业,而不是POST。

Resources are manipulated using a fixed set of four create, read, update, delete operations: PUT, GET, POST, and DELETE. PUT creates a new resource, which can be then deleted by using DELETE. GET retrieves the current state of a resource in some representation. POST transfers a new state onto a resource. See Responding to HTTP Methods and Requests for more information.源Oracle文档

相关内容

最新更新