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

如何设计具有正确语义的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 >读取

  • 问题内容: 我有以下疑问与如何在Java中创建格式日期有关。 在Java应用程序中,我必须创建一个采用以下格式的日期(该值必须是当前日期): 2015-05-26 ( yyyy-mm-dd ) 所以我知道我可以通过以下方式简单地构建一个新对象来获取当前日期: 但是如何指定日期格式? 特纳克斯 问题答案: 尝试这样: 要以yyyy-MM-dd格式格式化当前日期,您可以尝试像这样 请参考SimpleD