在纯粹的REST方法中,所有端点(起始端点除外)都是不透明的,不需要发布其各种详细信息。 即使使用这种方法,本文中的要点也很重要,因为服务器逻辑将必须确定何时需要结束点。

介绍

在REST体系结构中,实体或资源( 在本文的其余部分将使用术语“实体”)可能具有也可能没有其自己的地址。 例如,假设我们有一个库存应用程序,供商人用来销售其产品。 立即可以看到一个产品实体。 它的URL类似于:/ product / {id}

现在,销售产品的商人可以将自己的评论添加到产品中。 例如, ”
星期五的销售情况很好 ”或“ 如果产品没有开始销售,请考虑更改价格 ”。 一个产品可以有0 .. *注释。 如前所述,产品具有自己的地址:/ product / {id},例如/ product / 1231233

和这样的响应负载

{"id":"1231233","type":"Beer","comments": [{"id":"1","comment":"Sells very well on Fridays"                 }, {"id":"2","comment":"Consider changing price if product doesn't start selling"  }]}

可以看出,有效负载返回了注释对象的集合。 每个评论都应该有自己的地址,还是可以将它们嵌入产品响应中? 为了帮助回答这个问题,应考虑以下内容。

实体在包含实体上下文之外是否有任何意义?

如果实体(例如注释)在其包含的实体(例如产品)之外具有含义,则它们应具有自己的地址。 例如,假设实体是学生,并且学生返回了他/她所学习的大学列表。 这些大学在学生以外具有自己的含义。 所以很明显,大学应该有自己的地址。 在“活动/注释”业务情景中,“注释”仅针对活动存在。 没有其他实体会引用它们或需要引用它们。 因此,需要考虑其他方面。

是否需要对单个实体执行操作?

是否应该允许客户端创建,读取,更新或删除单个实体? 这些必须分开考虑。

写:创建,更新,删除

在产品/评论场景中,永远不会在产品外部或没有产品的情况下创建评论。 它实际上是添加到产品中的。 这可以视为对产品的部分更新。 但是,对现有注释的更新或删除也可以视为产品的部分更新。 这会导致如何使用产品的部分更新来区分创建/更新和删除注释之间的复杂性。 如果需要这样做,则为注释创建上下文地址(指示产品/注释的层次结构性质)然后允许客户端向其发送POST,PUT,PATCH,DELETES会更简单。

范例网址:/ product / 1231233 / comment / 1

在某些情况下,包含父实体的实体可能不会返回有关子实体的所有信息。 例如,再次考虑产品–>评论场景。 假设评论很大。 这将意味着产品的有效载荷也非常大。 在这种情况下,对于产品而言,仅返回评论摘要,如果客户希望完整的实体提出单个请求,则可能更为谨慎。 同样,如果要获得一个单独的实体会付出巨大的性能成本(例如,必须调用第三方API来获取有关注释的所有信息),那么将URL链接发送给实体(而不是而不是实际实体的内容。

N + 1问题

如果需要进行个别读取,请注意不要引起N + 1问题。 例如,假设一个产品可能有100条注释。 如果客户需要所有信息,则Product API将仅返回Comment的摘要以及指向每个评论的链接。 但是,如果客户端希望每个注释,则意味着现在将有100个HTTP请求。 如果这是一种可能的情况,则应考虑将所有评论汇总到产品中的辅助端点。 这类似于API网关模式。

端点表面积

在任何发布合同的体系结构中,如果合同过多,开发人员就很难理解。 大多数知名的API(例如PayPal,Amazon,Twitter,Google)通常只有大约20-30个地址。 这是一个好目标。 如果有5,000个不同的地址,它可能会变得太大而难以控制等。

总之,决策图提供了有关您应该做什么的指南。

翻译自: https://www.javacodegeeks.com/2018/01/rest-resource-get-address.html

REST资源何时应获得其自己的地址?相关推荐

  1. rest资源设计_REST资源何时应获得其自己的地址?

    rest资源设计 在纯粹的REST方法中,所有端点(起始端点除外)都是不透明的,因此不需要发布其各种详细信息. 即使使用这种方法,本文中的要点也很重要,因为服务器逻辑将必须确定何时需要结束点. 介绍 ...

  2. 常用资源环境生态地理空间数据开源下载地址整理

    上学时研究需要用到大量资源环境生态地理空间数据,曾经搜集了不少资料,但开源的数据鱼龙混杂,参差不齐,数据筛选.验证和使用花费了不少时间,着实需要整理一下,在此记录一下已经整理过的数据!有需要的朋友可以 ...

  3. (翻译)表单中应使用文本域输入地址的原因

      你是否曾经在填写表单时卡在地址字段?有研究发现,用户填写表单时,遇到"地址2"字段会不知所措,止步不前.   不仅如此,第二个字段会误导用户将地址拆分为两段填写,让用户感到困惑 ...

  4. 【科普+技术】Linux服务器被占用大量资源,用三大网站排查ip地址和初步处理挖矿病毒

    目录 一.前言 二.挖矿[科普篇] 2.1 什么是挖矿 2.2怎么挖矿 2.3挖矿设备 2.4个人对挖矿的看法 三.检查是否被入侵[技术篇] 3.1检查进程 3.2检查网络连接 3.3检查ip地址 3 ...

  5. 恰逢网络营销火爆之际网络营销外包应保持怎样的整合营销推广思路?

    众所周知,在网络营销外包公司中整合营销也是一种促进网络营销推广进一步展现在用户群体眼前的方式之一,面对这种更为轻松便捷.高营销效率的方式,如何有针对性的将其推广并应用在网络营销外包中才是专业网络营销外 ...

  6. Android之Providing Resources(提供资源)

    当你写程序的时候应该习惯于把一些程序需要用到的资源,例如图片和字符串,分开并独立地保存在你的程序代码之外,这样你就可以独立地维护这些资源文件.你还应该通过特殊的名字的文件路径,为特定的设备配置提供可替 ...

  7. ASP.NET 2.0 中的资源与本地化

    转自MSDN 下载本文的代码:BasicInstincts2006_08.exe (878KB) 本页内容 控制页面级别的区域性设置 使用配置文件跟踪语言首选项 ASP.NET 2.0 中的资源文件 ...

  8. c#自定义控件资源释放问题_定义资源

    c#自定义控件资源释放问题 在Fielding的论文中 ,资源描述为: "可以命名的任何信息"--"文档或图像,临时服务(例如,"洛杉矶今天的天气") ...

  9. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

    java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...

最新文章

  1. Thrift的接口定义语言IDL
  2. python程序如何循环_在Python的一段程序中如何使用多次事件循环详解
  3. 【HDOJ】1196 Lowest Bit
  4. 线程间同步的几种方法--互斥锁,条件变量,信号量,读写锁
  5. (六)ElasticSearch 6.1.1聚合查询
  6. Java中gatSum方法是什么_Oracle中的SUM用法讲解
  7. 力扣160.相交链表
  8. 计算机小白可以学python吗_非计算机专业小白如何系统学Python语言
  9. 深度学习(00)——GPU版本的TensorFlow
  10. Visual Studio Team System面面观系列课程幸运听众 又一次中奖,哈哈
  11. 360手机助手下载|360手机助手下载
  12. 如何正确认识网络工程师
  13. oracle 回收站清空,Oracle 清空回收站
  14. chr python用法_使用Python内建chr, ord实现的简单的加/解密
  15. 【bzoj1612】【Usaco2008 Jan】Cow Contest奶牛的比赛 题解代码
  16. 企业IT咨询和信息化规划方法
  17. No module named ensurepip
  18. 我是如何“0基础”掌握VR开发技术的
  19. 爬虫取中间文本_一线大厂爬虫工程师给初学者的 5 个建议
  20. 有效线索主题看板 阿善有用 清洗转换具体怎么做

热门文章

  1. 16、java中的集合(3)
  2. Sentinel(十)之系统自适应限流
  3. Java进阶之对象克隆(复制)
  4. 一道丧心病狂的java面试题
  5. JavaFX之TableView
  6. Sring类型数组赋值
  7. java反射机制的简单使用和优缺点
  8. fastdfs 集群 java_FastDFS集群部署(转载 写的比较好)
  9. thinking-in-java(14)类型信息
  10. 托管 非托管_如何在托管的Kubernetes上备份Neo4J