- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
通常我使用以下资源 URI 方案构建 RESTful API:
POST /products
PATCH /products/{id}
GET /products
GET /products/{id}
DELETE /products/{id}
产品还可能包含产品特性。当我想获得某些产品的功能时,我会执行 GET/products/{id}/features
。
顺便说一句,如果我想向给定产品添加新功能,通常我不会提供这样的资源 URI:PATCH/products/{id}/features
但我认为 features
是给定产品的一部分,因此,我更新哪些功能可能包含如下功能:
PATCH /products/{id}
{
"features": {
"add": [1, 2, 3]
}
}
另一方面,如果我想更新一些功能元数据,我不会使用产品资源,但我会执行这样的请求:
PATCH /products/features/{id}
{
title: "Test"
}
在我的例子中,产品特性与特定产品无关,但它们可以与许多产品相关联。
理想情况下,我应该更新哪些功能拥有给定产品,向 /products/{id}/features
发出 PATCH
请求,顺便说一句,它会使服务器 API 过于复杂,因为您需要分别涵盖所有实体的聚合。
我担心的是,是否可以考虑将某些给定聚合根的关联作为实体本身的一部分进行更新。
归根结底,人们可能会说像这样的 API 不完全是 RESTful,因为我不应该期望使用 PATCH
动词从某些给定产品中删除功能,但是 DELETE
:DELETE/products/{id}/features/{featureId}
,从客户端的角度来看,这比使用 DTO 修补产品更容易使用 API .
最佳答案
现在您的架构还不是很干净。一方面,您实现了 Restful 思维方式,但另一方面,诸如
PATCH /products/{id}
{
"features": {
"add": [1, 2, 3]
}
}
或
PATCH /products/features/{id}
{
title: "Test"
}
不直观。
对于第一个例子,我会推荐
PATCH /products/{id}
{
"features": [
{
"id": 1
},
{
"id": 2
},
{
"id": 3
},
{
"id": 4
}
]
}
您为该产品提供所有功能的地方。您不能只定义自己的元素add
,它会向产品添加给定的功能。更新资源的结构应该与您使用 GET/products/{id}
获得的结构相当(我猜您没有获得 add
属性,是吗?)。
对于第二个,您的网址应该是 /product-features/{feature_id}
或只是 /features/{feature_id}
。不要用 /products/features/{feature_id}
破坏模式 /products/{product_id}
。你为什么要这样想?这是合乎逻辑的 - 当您 GET/products
时,您不会获得包含所有功能列表的资源
{
...
"features": [
{
"id": 1
},
...
]
...
}
但不是所有产品的列表
{
[
{
....
"id": 1,
"features": ...
},
...
]
}
回答你的问题,如果你按照我的建议以一种平静的方式正确地实现它,更新产品的功能是绝对可以用这种方法的。
编辑:
About the thing of /products/features or /product-features, is thereany consensus on this? Do you know any good source to ensure that it'snot just a matter of taste?
我认为这是误导。我希望获得所有产品的所有功能,而不是获得所有可能的功能。但是,老实说,很难找到直接谈论这个问题的任何来源,但是有很多文章人们不尝试创建嵌套资源,如/products/features,而是这样做 separately .
About the thing of add when patching, it's the easiest way I've foundto express that I'm adding, updating or removing features from a givenproduct. In fact, it's a DTO
如果你想对集合使用一些 Action ,有一个标准。看看Best practice to batch update a collection in a REST Api call和 https://www.rfc-editor.org/rfc/rfc6902#appendix-A.2 .而不是
PATCH /products/{id}
{
"features": {
"add": [1, 2, 3]
}
}
你会发送
PATCH /products/{id}
{
"op": add, "path": "/features/0", "value": 1,
"op": add, "path": "/features/0", "value": 2,
"op": add, "path": "/features/0", "value": 3
}
BTW, note that you didn't answer the core issue in my question.
作为everything can be considered as sub-resource ,如果产品的功能作为一个集合是产品的一个属性,并且它也被视为启用 POST 的子资源,我看不到任何冲突。如果有人发现它不安全,那么您可以 cut it to operate仅在子资源上。
此外,在这个article作者认可用PATCH更新子资源的方式,简化了流程(整篇文章有点争议,但还没有结束我们感兴趣的事情)
Another solution is to expose the resource’s properties you want tomake editable, and use the PUT method to send an updated value. In theexample below, the email property of user 123 is exposed:
PUT /users/123/email
new.email@example.orgWhile it makes things clear, and it looks like a nice way to decidewhat to expose and what not to expose, this solution introduces a lotof complexity into your API (more actions in the controllers, routingdefinition, documentation, etc.). However, it is REST compliant, and anot-so-bad solution, but there is a better alternative: PATCH
关于json - 仅根据聚合根更新 RESTful 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41739067/
我对编程真的很陌生,并且在理解 RESTful API 的概念时遇到了一些麻烦。我读过 REST 和 RESTful API。我已经查看了 SO 中已经提出的问题,但似乎无法更好地理解该主题。 在我的
我以为我知道REST /“RESTFul”,restfulservices,webservices,SOA和微服务是什么,但是我遇到了许多不同的定义,我得出的结论是这些术语被过度使用,滥用或完全错误定
我有一个列表,其中有一个“人员和组”列。当我使用 REST 查询行时,我会在此列中列出用户 ID。 我发现这篇文章将帮助我将每个 id 转换为标题 http://www.codeproject.com
我想问一些关于 REST 调用的问题。我是 REST 调用的绿色,我想了解什么是 REST 调用以及如何使用 URL 向服务器发送 REST 调用。谁能给我一些基本的教程或链接供我引用? 另外,如果我
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 8年前关闭
如果有一个 REST 资源我想监视来自其他客户端的更改或修改,那么最好(也是最 RESTful)的方法是什么? 我这样做的一个想法是通过提供特定资源来保持连接打开,而不是在资源不(尚)存在时立即返回。
我有一个可以返回大量项目的 RESTful API,我希望能够使用分页样式技术来限制项目数量,这是 RESTful API 中的一个好主意吗? 如果有可能最好通过链接(在这种情况下为 url)或请求正
我仍然处于适应以 REST 方式做事的过程中。 在我的情况下,客户端软件将与 RESTful 服务交互。很少,客户端会上传其整个实体数据库(每个实体序列化为大约 5kb 的 xml 块)。 也许我错了
设计一个路径解析可能有歧义的 REST API 是否被认为是不好的做法?例如: GET /animals/{id} // Returns the animal with the given ID
我知道 REST 并且知道在不使用 session 的情况下创建 RESTful Web 服务,我更了解它,但我不太了解无状态的概念以及使用 REST 如何使您的应用程序可扩展 有人可以解释 REST
我正在尝试找到解决以下问题的最佳方法:我们的应用程序是SaaS,它支持Web登录的SAML。该应用程序还公开了应该在自动化和无人值守的流程中使用的REST API,这意味着没有交互式用户可以键入凭据。
由于 REST 是无状态的,因此传入的每个请求都不知道传入的前一个请求。在这种情况下是否可以使用连接池? 如果要实现连接池,它将像标准数据库连接一样在每个请求时打开连接池并关闭它。 如何实现 REST
得墨忒耳定律(真的应该是得墨忒耳的建议)说你不应该“穿过”一个物体去接触它们的子物体。如果您作为客户需要执行一些重要的操作,大多数情况下您使用的域模型应该支持该操作。 REST 原则上是一个愚蠢的对象
我唯一真正接触到 REST 的想法已经通过 Ruby on Rails 的 RESTful routing .这非常适合我使用 Rails 构建的基于 CRUD 的应用程序,但因此我对 RESTful
有什么好处 http://www.example.com/app/servlet/cat1/cat2/item 网址 超过 http://www.example.com/app/servlet?c
我知道以前有人问过这类问题。我有我的问题的解决方案,我想知道我是否在任何地方破坏了 REST 或 HTTP 主体。 在我的系统中,我有一个名为 member 的资源。支持通常的GET/POST/PUT
我有一个API,可以执行一些批量处理任务。假设它确实为某些资源命名。 我批量传递了7个请求,其中5个更新成功,2个失败。 我的问题是如何应对。使用HTTP时,我无法同时返回成功和错误。 有一个部分成功
我来自 RPC 世界,但目前正在调查使用 REST 是否适合我的项目。至于据我了解 Wikipedia RESTful 服务的基本思想是提供对集合及其各个元素的访问。 在我的情况下,服务器将是一个测量
我想将REST添加到我的挂毯项目中,因此需要知道如何实现它。 有什么更好的方法? 谢谢。 [编辑,从答案中复制:]我必须将GET,PUT,POST和DELETE服务添加到我的挂毯应用程序中。我看到Ta
让 /users/{id}成为 RESTful 服务中的资源 url。 启用基本身份验证,只有经过身份验证的用户才能访问该 url。 示例场景: User_1 & User_2是经过身份验证的用户,用
我是一名优秀的程序员,十分优秀!