gpt4 book ai didi

rest - 更新/创建分层资源 REST

转载 作者:行者123 更新时间:2023-12-03 03:32:37 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

3年前关闭。




Improve this question




我正在处理 REST API我正在尝试了解如何处理分层资源。

背景

让我们从一个简单的例子开始。在我的 API 中,我有 用户 , 用户个人资料 评论 .

  • 用户必须有 用户个人资料 关联(一个用户配置文件只对应一个用户)
  • 用户可能有 点评 关联(一条评论仅对应一个用户)

  • 用户的资源表示应该是:
    User: {
    "u1": "u1value", // User's attributes
    "u2": "u2value",
    ...
    "links": [{
    "rel": "profile",
    "href": "http://..." // URI of the profile resource
    }, {
    "rel": "review",
    "href": "http://..." // URI of the review resource
    }]
    }

    用户配置文件资源表示应该是:
    UserProfile: {
    "p1": "p1value", // Profile attributes
    "p2": "p2value",
    ...
    "links": [{
    "rel": "owner",
    "href": "http://..." // URI of the user resource
    }]
    }

    评审资源表示应该是:
    Review: {
    "r1": "r1value", // Review attributes
    "r2": "r2value",
    ...
    "links": [{
    "rel": "owner",
    "href": "http://..." // URI of the user resource
    }]
    }

    资源 URI 可以是:
  • http://api.example.com/users/{userid} : 访问用户资源
  • http://api.example.com/users/{userid}/profile :访问用户的个人资料资源
  • http://api.example.com/users/{userid}/review :访问用户的评论资源

  • 资源创建:创建用户的正确方法是什么?

    现在我想创建一个新用户:
  • POST http://api.example.com/users {"u1": "bar", "u2": "foo"}我取回了新的用户 ID = 42
  • POST http://api.example.com/users/42/profile {"p1": "baz", "p2": "asd"}
  • PUT http://api.example.com/users {"u1": "bar", "u2": "foo", links: [{"rel": "profile", "href": "http://api.example.com/users/42/profile"]}

  • 我的担忧:
  • 如果在 1 和 2 或 2 和 3 之间出现中断怎么办?
  • 在 3) 中,服务器是否应该自动更新 http://api.example.com/users/42/profile 中的链接? ,指向正确的所有者?
  • 更新链接字段是创建关系的正确方式吗?还是应该跳过第 3 步)让系统根据 URI 约定猜测关系? (我在几本书上读到 URI 应该被认为是不透明的。)
  • 最佳答案

    您的担忧是正确的,并且您的问题 list 是正确的。如果我可以建议,您的方法看起来非常像您正在使用关系数据库方法并且正在执行 INSERT,从用于下一个 INSERT 的序列中检索 PK,等等。

    让服务器保持引用完整性

    作为观察,即使遵循您的原始方案,完全省略步骤 3 . links 中的 URI检索用户文档时可见的内容应该由服务器根据配置文件记录的存在生成。

    例如,如果使用关系后端,则从 USERS 中选择以获取用户记录。接下来,您从 PROFILES 中选择。如果有记录,则修改返回数据结构以包含引用。

    发布整个文件

    解决您提出的其他问题的常用方法是允许将整个文档发布到用户 URL(如 NoSQL 数据库,如 MongoDB )。这里的文档是用户和个人资料:

    { 
    "u1": "bar",
    "u2": "foo",
    "profile": {
    "p1": "baz",
    "p2": "asd"
    }
    }

    在这种方法中,服务器上的端点接收嵌套结构(文档)并执行 INSERT 到 USERS,检索 PK,然后使用此 PK 执行 INSERT 到 PROFILES。在服务器端这样做可以解决几个问题:
  • 事务可以是原子的
  • 客户端和服务器之间只有一次网络交换
  • 服务器完成繁重的工作并可以验证整个事务(例如,如果配置文件无效,则不会创建用户)
  • 无需步骤 3。

  • 请注意,这种方法是对上面详述的 API 的补充——您仍然希望能够直接访问用户的个人资料。

    GET - 客户端可以指定字段

    与知名公司的 API 进行比较很有趣。拍 LinkedIn例如。在他们的 developer API用户的默认 GET 仅返回用户名、标题和 URI。

    但是,如果请求指定了额外的字段,你可以得到嵌套数据,例如 http://developer.linkedin.com/documents/understanding-field-selectors 中的第二个例子返回用户的姓名和他们所担任职位的公司名称列表。您可以为配置文件和评论实现类似的方案。

    用于更新文档属性的补丁

    通过插入和查询,可能值得考虑如何更新(PATCH)数据。覆盖字段是显而易见的,因此您可以,例如 PATCH 到 http://api.example.com/users/42以下:
    { 
    "u1": null,
    "u2": "new-foo",
    "profile": { "p1": "new-baz"}
    }

    哪个会取消 u1 , 设置 u2new-foo并更新配置文件的 p1new-baz .请注意,如果缺少字段 ( p2),则不会修改该字段。 PATCH 比旧的 PUT 更可取,如 this answer 中所述。 .

    如果您只需要更新配置文件,请将新的配置文件记录直接 PATCH 到 http://api.example.com/users/42/profile

    DELETE 应该级联

    最后,删除可以使用指向要删除的资源的 DELETE 方法来完成 - 无论是用户、个人资料还是评论。实现级联删除,以便删除用户删除他/她的个人资料和评论。

    关于rest - 更新/创建分层资源 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235201/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com