当前位置: 首页 > 知识库问答 >
问题:

如何设计具有正确语义的restful API?

慕金林
2023-03-14

例如,当向用户出售订阅时 - 系统将做的是

  • 创建一个组织
  • 创建用户
  • 创建订阅
  • 创建身份验证
  • 创建并发送电子邮件。
  • 更多基于业务逻辑的操作

以上所有内容都需要作为工作单元在同一数据库事务中发生。

在 SOAP 语义中,它可以抽象为寄存器(组织、用户、计划、身份验证详细信息。更多参数),并返回订阅对象。

但是在Restful World中,我们只会用HTTP动词处理资源(URL中只有名词),我发现很难描述这样的业务相关逻辑,而不是简单的CRUD?

共有2个答案

谷梁鸣
2023-03-14

事实上,您认为使用RPC模式;-)

对于REST,您必须考虑使用资源和表示。您要做的是添加订阅,因此我建议使用实现注册的方法<code>POST<code>为订阅提供一个列表资源。在请求有效负载中,您将提供订阅所需的信息,并返回有关创建订阅的提示。

以下是请求的示例:

POST /subscriptions/
{
    "organization": {
        "id": "organizationId",
        "name": "organization name",
        (...)
    },
    "user": {
        "lastName": "",
        (...)
    }
}

下面是响应的示例:

{
    "id": "subscriptionId",
    "credentials": {
        (...)
    },
    (...)
}

您可以注意到,有效负载是建议,可能与您的订阅、用户,...结构。所以请随意修改它们。

希望它能帮助你,蒂埃里

张逸清
2023-03-14

RESTFUL接口不要求它们1:1映射到API后面的数据库。

你的逻辑可能是:

client -- POST: SubscriptionRequests(request) --> Server
client <-- RESPONSE: Status|Error   --  Server

成功后,Status 响应可能包含包含生成的新条目的 URI 的属性。例如:SubscriptionURI = “Subscriptions/ID49343” UserURI=“Users/User4711”。

然后有人可以稍后询问活跃订阅:

client -- GET: Subscriptions               --> Server
client <-- RESPONSE: Subscriptions | Error --  Server

这个方案可以被认为是RESTful。服务器必须操作数据库(客户端不可见)以及它如何操作这一事实没有问题。

与执行SubscriptionRequest操作之前相比,订阅资源(以及用户资源)上的后续GET操作也不会产生不同的输出。

也没有令人信服的理由来创建一个更健谈的界面,只是因为你碰巧有一定的数据库建模在后面。< br >从这个意义上说,如果您创建了这样的API,情况会更糟:

client -- POST: Users(newUser)    --> Server
client <-- RESPONSE: Status|Error -- Server
(if adding user worked bla bla ... )
client -- POST: Subscriptions(userId,other data..) --> Server
client <-- RESPONSE: Status|Error  -- Server

这基本上意味着您没有设计API,只是简单地复制了数据库表的结构(下周将更改)。

总之,API设计的业务不是关心实现如何处理数据库。如果您需要事务,或者如果您使用其他方法来确保所有需要完成的事情都已完成,则取决于SubscriptionRequests的实现。POST处理程序。

 类似资料:
  • 我必须给出使用Site Minder的SSO架构的建议。我们几乎没有J2EE应用程序。这些J2EE应用程序设计为在SSO提供者进行身份验证后,当http头包含信息时工作。我们一直保持应用程序SSO提供程序不可知。这意味着我们只依赖SSO提供程序的头。这在RSA作为SSO提供程序的情况下运行良好。 现在SiteMinder提出了另一种架构。请求的流动方式是 带IIS的SiteMinder- 要崩溃,

  • 我的问题是我应该让(板中的凹陷孔)成为的属性还是应该让成为的属性 我有以下工程分析课程: 然后我有代表各种关节的类 沉头孔仅适用于,但我需要验证用户输入的板材厚度是否大于沉头孔的深度。我只是在底板中将沉头孔设置为null,还是将沉头孔属性放在关节类中更好?或者我应该使用其他模式,比如子类? 我将涂层和材料作为属性添加到每个零件中,因为它太过冗长,无法添加到接头中,例如: 我可能可以让它在任何一种情

  • 我试图在递归中总结一个数字的数字,而不是正确的数字。例如,如果输入是1234,那么输出应该是6(1+2+3)。如果输入只有1位数,那么函数应该返回0。 我不知道如何才能同时做到这一点:计算数字,从结果中删除最后一个数字,如果输入是一个数字,那么它也应该返回0。下面的代码汇总了除左位以外的所有数字。如果我尝试使用revNum函数,那么对于数字'100',结果是0而不是1。需要任何帮助请:)

  • 在制作后端服务器之前,我正在设计Restful API。这项服务是小型Instagram,我想知道我的restful设计是否符合REST原则。 认证 创建帐户:POST /auth/user 删除帐户:删除 /auth/user 登录:发布 /auth/session 注销:删除 /auth/session 邮政 < li >加载摘要:获取/发布 < li >创建帖子:帖子/帖子 < li >读取

  • 问题内容: 我正在上高中AP计算机科学课程。 我决定在我们的一个实验室里发表一个声明,只是为了玩弄,但是我遇到了这个错误。 我问了一个关于Stackoverflow 的问题,以找出如何正确执行它,并且我所做的完全如答案之一所示。我真的不明白为什么编译器想要一个语句(至少这是我假设的要求),我也不知道如何使用。似乎希望重新启动的部分是一个变量,但是重新启动只是将程序拉回到第10行的标签,以便用户可以