我正在开始一个新项目,我试图弄清楚我是否应该遵循RESTful方法。通过阅读互联网上的不同来源,我对如何真正的RESTful方法越来越感到困惑。有人说REST请求(即HTTP请求的URI和其余内容)绝不应该用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吗?
提前谢谢!
答案 0 :(得分:1)
REST是关于机器到机器的通信。如果您没有至少2个不同的客户端,我认为实现REST服务不值得。
有人说 REST请求(即HTTP请求的URI和其余内容)绝不应该用HTTP动词以外的其他内容描述动作。其他人说由于HTTP谓词是有限的,HTTP请求主体可以提供关于需要对URI描述的数据应用哪个动作的附加信息。哪两个是正确的?
你应该阅读Fielding dissertation,它是唯一真正的知识来源。 :d
两者都可能是错的。第二个更接近事实。如果需要描述新操作,则始终可以定义新资源并将其与现有HTTP谓词一起使用。例如,可以使用ANALYZE /datasets/1
来描述POST /analysis/ {dataset: {id: 1}}
。
请注意,我们在这里谈论超链接:
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
访问表单说明。 (目前,人们正在研究标准格式,以描述这些描述,例如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",
...
}
}
}
但如果您描述docs文件中的所有内容,则可能更容易生成文档,可能在REST客户端的JSON-LD中以及客户端的第三方开发人员的HTML中。
POST / analysis01_jobs / - 为analyze01提交一份新工作
GET / analysis01_results / - 获取来自analysis01工作的所有可用结果的列表
GET / analysis01_results / 01 - 获取执行01类型分析的作业的结果.HTTP响应的正文还将包含有关“父”作业和数据的信息。
我宁愿使用
POST /jobs/ {analysis: {id: "01"}}
GET /analysis/01/jobs
GET /jobs/2345/result
答案 1 :(得分:0)
你正朝着正确的方向前进,但你仍然可以调节它。
1 -
REST是我的应用程序的一个很好的解决方案吗?
是的,您可以对它进行比较。REST vs SOAP on this question
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 docs