Api Can';我不懂一些基本的休息知识

Api Can';我不懂一些基本的休息知识,api,http,rest,Api,Http,Rest,假设我的模型是: 用户: 身份证 绰号 我有一个收藏/users/ 我希望通过/Users/{id}而不是/Users/${昵称}检索用户,因为在一些更复杂的情况下,可能没有“逻辑唯一约束” 因此,我可以使用基本的JSON有效负载,例如: { id: 123, nickname: 'someUserName' } 这里没什么特别的 发布到/users/ 据我所知,用户是一个标识符。它是资源表示的一部分,因此应该在有效负载(?)中 如果我想自己在后端生成ID,比如使用DB序列,该怎

假设我的模型是:

用户:

  • 身份证
  • 绰号
我有一个收藏
/users/

我希望通过
/Users/{id}
而不是
/Users/${昵称}
检索用户,因为在一些更复杂的情况下,可能没有“逻辑唯一约束”

因此,我可以使用基本的JSON有效负载,例如:

{
  id: 123,
  nickname: 'someUserName'
}
这里没什么特别的


发布到/users/

据我所知,用户是一个标识符。它是资源表示的一部分,因此应该在有效负载(?)中

如果我想自己在后端生成ID,比如使用DB序列,该怎么办

然后我的有效载荷变成:

{
  nickname: 'someUserName'
}
这是否恰当

这篇文章的输出应该是什么?没有什么?只是引用资源位置(包括ID)的头


上车/users/id

获取资源时,我们将其内容加载为JSON:

{
  id: 123,
  nickname: 'someUserName'
}

打开/users/id

据我所知,此方法上使用的有效负载应该“覆盖”资源内容。如果我们想要部分更新,我们会使用补丁

但如果我这样做了呢:

PUT /users/123

{
  id: 456,
  nickname: 'someUserName'
}
这是否意味着我们要更新资源的id

在URI和负载中同时使用id不是有点多余吗


实际上,我真的不知道如何处理
id

我不知道我是否应该在所有POST/PUT/DELETE操作中使用相同的资源表示

我不知道id是否应该是唯一(?)资源表示的一部分。 但是如果id不是表示的一部分,那么当我使用GET
/users/
列出用户时,如果没有返回id,那么我不知道客户端如何获取用户id

有人能帮我吗?:)

首先
如果不使用HATEOAS,就不是REST

我希望你能理解这一点,我会在最后再谈这一点

发布到/用户/ 在POST有效负载中不使用ID完全可以。如果存在ID,则会发出错误消息,以便开发人员理解他们做错了。
因此,如果用户资源中没有任何其他内容,那么只有昵称作为有效负载才是完全有效的

服务器的输出应包括三个重要内容:

  • 标题:表示成功或失败的状态代码(通常创建
    201
  • 标题:新创建的资源的位置(仅
    位置:/path/to/resource
  • 主体:已创建资源的表示形式。返回一个完整的有效载荷,就像在一个GET 得到 完全有效

    放 您关于PUT/PATCH的分析符合规范,新资源应该与有效负载相同,这意味着如果id不同,用户希望更改id。如果有效负载包含不应更改的值(如ID),则有两种可能性:

  • 忽略有效负载中的ID
  • 返回错误
  • 在这两种情况下,都要告知用户您做了什么,出了什么问题。我宁愿发送/接收400个错误请求。如果特权用户可以更改ID,但特定用户不能更改,则403禁止可能更合适。 还要确保记录您的API行为。您可以允许在API中省略ID。不要忘记以一致的方式处理POST有效负载中给出的ID

    总体问题 REST在资源上运行。
    /users/是资源集合的一个示例
    /users/{id}是单个资源的一个示例
    您应该始终在每个响应中使用完全相同的表示。如果出于某种原因,只提供信息片段更合适,请添加指向完整资源表示的元数据(链接)。
    除用户的第一次POST请求外,ID始终存在。 POST意味着资源的未来位置未知,必须由服务器提供。 这也意味着GET/users/应该返回每个资源的ID

    和往常一样,API在请求中返回严格且宽容的消息。记录您的行为,以便用户可以学习

    哈提奥斯 如果您实现HATEOAS(作为应用程序状态引擎的超媒体),REST的真正魅力就会显现出来。这部分意味着您应该使用有用的标记/链接组合来增强表示。这样,客户端就不再需要构造url了

    用于用户表示的示例如下:

    {
        "_links:" {
            "self": { "href": "http://yourrest/users/123" }
        },
        "id": "123"
        "nickname": "someUserName"
    }
    

    使用HAL的一个很好的总结是由编写的(第一个条目完全没有zf,只解释HAL)。

    我将您的描述解释为,
    id
    不是资源的一部分,它是资源的唯一标识符。在这种情况下,它不应成为任何操作的有效载荷的一部分

    POST/users
    使用有效负载
    {“昵称”:“someone”}
    将创建一个新资源,并在位置头中返回一个URL。该URL可能看起来像
    /users/123
    ,但从客户的角度来看,没有理由期望这样。它可能看起来像
    /something/other/完全是

    GET/users/123
    将(假设URL是由以前的帖子返回的)返回有效负载
    {“昵称”:“某人”}

    PUT/users/123
    将(与上面的假设相同)用PUT发送的有效负载替换资源,比如
    {“昵称”:“其他人”}

    如果您希望客户端能够命名资源,那么您还可以让
    PUT/users/123
    使用该URL创建一个新资源

    我不知道重命名资源的常用REST方式。我认为,将旧URL作为查询部分或正文的一部分的帖子是有意义的

    现在,假设我错了,您确实希望
    id
    成为资源本身的一部分