我有一个预算实体......
在某些时候,该应用可让您为客户创建新预算。在保存预算之前,您可以选择生成预览,其中显示基于您的选择的总金额。
这些计算是在服务器中完成的,因此我需要公开相应的端点,但我不确定该端点应该是什么。
我在想tr '~' '\n'
发送所需的参数。
这是对的吗?这将指向[GET] http://example.com/budgets/preview/
类中的preview()
方法。
那么我已经保存的预算预览呢?
budget
?
答案 0 :(得分:1)
请记住,REST就是在需要时对资源进行多次表示,因此要确定的首要事项之一是资源是什么以及它们之间是否存在任何关系。
对我而言,您似乎将预算作为资源和预算预览作为资源的概念,并且您希望能够在以后检索其中任何一个。
我建议使用以下URI'seems
[GET] http://example.com/budgetPreviews/generate
这将在服务器上生成并返回budgetPreview而不存储它。 IMO在API中似乎并不清楚创建budgetPreview的路由是否嵌套在预算范围内。我还主张稍微偏离“所有端点必须是名词”,以支持可以在资源上或资源上执行的业务操作。如果有人争辩,你可以将生成更改为“generateRequest”,因为实际上你将文档传递给服务器,其中填充了代表生成budgetPreview请求的值。我在这里做的一个假设是,服务器构建budgetPreview所需的所有信息都是从GET请求中的客户端传递的。
要注意的一件事是,您需要将所有信息都包含在URI中作为查询参数,因为返回的值将根据参数而有所不同。在GET主体中传递值然后赋予该主体语义(即根据正文中的值创建不同的资源)将破坏缓存(如果您正在执行任何操作)。
[GET] http://example.com/budgetPreviews
返回所有现有存储的预算视图
[PUT] http://example.com/budgetPreviews/ {GUID}
使用put在此处创建资源并允许客户端确定id意味着在超时的情况下可以重试存储资源的请求并允许幂等性。在您存储预算预览的同时,您可以在参数中提供预算的ID并链接它们。
[GET] http://example.com/budgets/ {GUID} / budgetPreview
[GET] http://example.com/budgetPreviews/ {GUID}
这些是标识相同资源的不同URI,允许客户端使用不同的方式来使用budgetPreview
额外的一点是不要混淆您的底层资源或实现细节,例如调用哪个方法与面向公众的API的外观。旨在让您的面向公众的API尽可能地适合客户,并且您返回的表示专注于建模客户合同而不是基础资源的持久性。
另外,一个聪明人曾告诉我的另一件事是记住你有无限的URI可供你使用,所以当它给你的API清晰度和你的客户正是他们想要的东西时,不要害怕创造更多。
答案 1 :(得分:0)
请勿在{{1}}之后重载网段以包含ID或“预览”。相反,使用
/budgets
现有预算可以提供指向其预览的链接,而新预算可以请求预览。如果您选择,可以在执行[GET] /budgets/{id}
[POST] /budget-previews
> returns a preview given the data in the body
[GET] /budget-previews/{id}
> returns a preview given data on the server
时单独保存预览,然后可以使用POST /budget-previews
从预览中创建预算(或将预览ID放在{{1}的正文中}})。我会避免使用预算ID作为预览ID,以防您以后决定单独保存预览。
如果有并且不会有其他类型的预览,请考虑使用POST /budgets?previewId={}
代替POST
。