Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >REST:如何创建依赖于三种或三种以上不同类型的资源的资源?

REST:如何创建依赖于三种或三种以上不同类型的资源的资源?
EN

Stack Overflow用户
提问于 2009-09-09 15:43:16
回答 3查看 2.6K关注 0票数 7

RESTful、超文本驱动系统需要使客户端能够创建依赖于三种或三种以上不同类型的资源的新资源。公开此功能的最佳方法是什么?

举个例子,假设我经营一家网上商店。服务器知道四个资源:

  • 订单:将装运的产品组。有一批货
  • 目的地:要运送到的地点。有很多货
  • 装运:向客户发送产品的行为。属于目的地、订单和封隔器
  • 包装工:雇员亲自准备装船订单。有很多货

当订单发出时,客户端需要通过在服务器上创建一个新货件来记录此事件。这批货物将需要对目的地、订单和包装的参考。

为了实现新发货的创建,我可以想到三种方法,但我不喜欢它们中的任何一种:

  1. 使用托运媒体类型将邮件发送到/shipments。托运媒体类型有三个字段:“order_uri”、“packer_uri”和"destination_uri“。每个URI分别用作装运中涉及的订单、封隔器和目的地的唯一标识符。
  2. 使用托运媒体类型将邮件发送到/orders/{order_id}/packers/{packer_id}/destinations/{destination_id}/shipments。
  3. 向系统添加一个名为"ShipmentBuilder“的新资源。使用包含在/shipment_builders媒体类型中的"packer_uri“、"destination_uri”和"order_uri“发送到ShipmentBuilder。

我不喜欢选项1,因为装运媒体类型还定义了指向订单、封隔器和目的地的链接。在这里,"link“是一个JSON散列,由一个人类可读的名称、一个URI和一个媒体类型组成。在媒体类型中添加"order_uri“、"packer_uri”和"destination_uri“似乎不太枯燥,因为它重复了相关资源的URI。

选项2使用了深度嵌套的URI,它既不能很好地维护,也不能捕获任何有意义的层次信息。

选项3在客户端和货件创建之间设置了另一个抽象级别,这使得系统更难学习。

如果一批货物只依赖于另一种资源,那么选项2就更有意义了,但在这种情况下就不是了。就目前情况而言,我赞成备选案文3,但更倾向于更好的选择。

在本例中,创建新托运的URI和媒体类型的最佳组合是什么?还应考虑采取哪些其他办法?

更新:下面是装运资源的JSON示例表示,显示订单、封隔器和目的地的链接。选项1所要求的URI重复出现在“托运”散列中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "shipment":{
    "created_at": "Wed Sep 09 18:38:31 -0700 2009",
    "order_uri":"http://example.com/orders/815",
    "packer_uri":"http://example.com/packers/42",
    "destination_uri":"http://example.com/destinations/666"
  },
  "order":{
    "name":"the order to which this shipment belongs",
    "uri":"http://example.com/orders/815",
    "media_type":"application/vnd.com.example.store.Order+json"
  },
  "packer":{
    "name":"the person who packed this shipment",
    "uri":"http://example.com/packers/42",
    "media_type":"application/vnd.com.example.store.Packer+json"
  },
  "destination":{
    "name":"the destination of this shipment",
    "uri":"http://example.com/destinations/666",
    "media_type":"application/vnd.com.example.store.Destination+json"
  }
}

“托运”哈希(减去"created_at“字段)的内容将得到POSTed。使用GET时,将发送上述完整的货件表示。

EN

回答 3

Stack Overflow用户

发布于 2009-09-09 16:13:43

REST“层次结构”没有任何意义。它们为导航以路径的形式显示关系提供了方便。不是层级本身,而是一条道路。因此,如果您放弃了“层次结构”概念,并认识到到同一最终位置有许多替代路径,则选项2实际上是明智的。

您的选择2是一个订单->包装->目的地路径。理论上,订单->目的地->包装和包装->订单->目的地,包装->目的地->订单,以及少数其他所有领导相同的地方。是的,支持他们是件痛苦的事。然而,这证明了它们都是等价的,而且没有等级制度。

“我不喜欢选项1,因为它看起来不太干燥。”

所以?省去那些重复的东西。为什么一批货物还必须包含订单和封隔器信息的完整重复?URI引用足以允许查找和检索Order和Packer。为什么要发订单和封隔器?

“选项3使系统更难学习。”为了谁?开发商?您的系统是围绕开发人员设计的,而不是用户和他们的用例?惭愧。

REST的要点是(通常) URI是绝对的、最终的和永恒的。哪种选择为您提供了绝对最佳的URI结构?请注意,URI不是层次结构,而是路径--对象可以存在于多个可选路径的末尾。

你在制造一批货。发到/shipment。简单、清晰的URI才是最重要的。

票数 3
EN

Stack Overflow用户

发布于 2009-09-09 18:33:11

好吧,现在我知道你在哪里看到复制了。张贴以下内容是否可行?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "shipment":{
    "created_at": "Wed Sep 09 18:38:31 -0700 2009",
    "order":{
      "uri":"http://example.com/orders/815"
      },
    "packer":{
      "uri":"http://example.com/packers/42",
    }
    "destination":{
      "uri":"http://example.com/destinations/666",
    }
  }
}

把这个还给我

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "shipment":{
    "created_at": "Wed Sep 09 18:38:31 -0700 2009",
    "order":{
      "name":"the order to which this shipment belongs",
      "uri":"http://example.com/orders/815",
      "media_type":"application/vnd.com.example.store.Order+json"
    },
    "packer":{
      "name":"the person who packed this shipment",
      "uri":"http://example.com/packers/42",
      "media_type":"application/vnd.com.example.store.Packer+json"
    },
    "destination":{
      "name":"the destination of this shipment",
      "uri":"http://example.com/destinations/666",
      "media_type":"application/vnd.com.example.store.Destination+json"
    }
  }
} 

也许这只是在JSON中不起作用,但是我在我的资源中对XML做了类似的事情。其思想是,您可以向服务器传递一个对资源的“引用”,只需填写uri,服务器就可以填充对象中的其余数据。

票数 1
EN

Stack Overflow用户

发布于 2013-12-02 02:36:16

我认为option1和option2是公平的解决方案,我会忘记option3,因为以前的解决方案更好。

客户端应该始终通过检查链接的语义(例如链接关系和特定于供应商的MIME类型)来决定,而不是通过检查URL结构来决定。您不一定需要特定于供应商的MIME类型,您可以使用和RDF格式,如JSON-LD、REST和应用程序特定的语音来描述您的链接及其输入字段,例如Hydra。您也可以使用自定义解决方案,例如将_fields添加到_links。

复制的链接没有什么问题。如果消息大小太大,可以使用gzip。顺便说一句,不要把URL和链接混为一谈,它们是不同的东西。URL是资源标识符,链接是对资源的可能操作调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1402721

复制
相关文章
寻找学习资源的三种方式
第一种,对外部资料的搜索,比如百度、微信、得到等其他领域APP内进行搜索,网页搜索如果有条件请使用google搜索。没有条件也推荐用必应搜索。
石云升
2022/08/25
6630
寻找学习资源的三种方式
三种不同的负载均衡类型
未使用负载均衡 这种情况下用户直接与web服务器进行连接,且该服务处于单点得状态,如果we server挂掉了,那么后续的所有连接都不回成功,同样的如果访问用户量比较大,因为服务器繁忙的原因可能有
小小科
2018/05/02
1.1K0
三种不同的负载均衡类型
Hook:如何高效双向链接不同类型的信息资源?
上周二晚上的直播里,我给你谈了「知识网络的链接」。这是朋友圈里小伙伴热情洋溢的留言记录。
王树义
2021/08/26
1.3K0
Hook:如何高效双向链接不同类型的信息资源?
解析存储资源盘活系统的三种缓存模式
缓存,是利用局部性原理,将高频操作的数据存放到访问速度更快的介质中,后续读取相同数据时无需再访问慢速设备,从而可以显著降低操作延时,提高读写速度。局部性原理有两种:
存储小白
2023/03/30
3460
java的三种不同注释方式
注释:是一种在程序源代码中插入的不影响程序运行的文字,可以在不妨碍程序运行的同时,使得代码具有更强的可读性(提前注释好代码的作用总是比看一遍代码理解其作用来的快的),既方便自己回头修改与更新代码,也方便了他人阅读自己的代码。
全栈程序员站长
2022/09/08
3270
java的三种不同注释方式
调度的三种类型
活动调度 在活动调度基础上通过更改机器上的加工顺序,使至少一个工序可以提前加工,必然导致其他工序完成时间推迟。也就是说,在活动调度中,在保留可行性的前提下,没有任何工序可以插入加工时间表前面的空隙中。
mwangblog
2019/01/23
2K0
调度的三种类型
VAE的三种不同推导方法
我们将VAE与GAN都可以放到分布拟合的框架下考虑,简单说,就是有一个未知的真实数据分布,我们想要表示该分布。而VAE最精髓的步骤之一,就是使用隐变量,将数据分布的表征分为两步。
CreateAMind
2019/10/14
2.7K0
ANR的三种类型
ANR一般有三种类型: KeyDispatchTimeout 1:KeyDispatchTimeout(5 seconds) –主要类型 按键或触摸事件在特定时间内无响应 BroadcastTimeout 2:BroadcastTimeout(10 seconds) BroadcastReceiver在特定时间内无法处理完成 ServiceTimeout 3:ServiceTimeout(20 seconds) –小概率类型 Service在特定的时间内无法处理完成
小小工匠
2021/08/16
8320
线程的三种创建方式
继承Thread类 1. 自定义线程类,继承Thread类 2. 重写run方法,编写线程执行体 3. 创建自定义线程类对象,该对象调用start()方法开启线程 public class TestThread1 extends Thread{ @Override public void run() { //线程执行体 for(int i = 0; i <10;i++){ System.out.println("线程正在执行****
高大北
2022/06/14
2140
创建线程的三种方式
1)继承Thread类,重写run方法 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程
名字是乱打的
2022/05/13
2360
23_同时创建父子资源 & 创建资源集合
http://mpvideo.qpic.cn/0bf2qyassaab3eapjq6lqzpvdbwdfgdackia.f10002.mp4?dis_k=3a1d6e9ce931af6abc284df
宿春磊Charles
2022/03/29
3570
java创建线程的三种方式
想写的基础性文章已达90篇文章了,无论是基础性技术文章还是生活所感到这篇就结束了,感谢一路陪伴的读者和朋友,感谢过去的自己,你陪我成长,我陪你长大。
码农王同学
2020/03/25
3620
java创建线程的三种方式
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class NewThreadDemo { public static void main(String[] args) throws InterruptedException, ExecutionException {
似水的流年
2019/12/07
5690
Oracle创建主键的三种方式
从trace我们能看到,对T_PK_02加了share模式锁,指定nowait,先创建的约束,然后创建了唯一索引,
bisal
2021/03/20
1.7K0
记住变量类型的三种方式
Python作为一门动态语言,其变量的类型可以自由变化。这个特性提高了代码的开发效率,却也增加了阅读代码和维护代码的难度。
青南
2018/08/30
4950
记住变量类型的三种方式
三种验证类型的https证书
https证书即SSL证书,其三种验证类型是指DV、OV、EV。不同的验证类型适合不同的网站,具体应该怎么选择呢?
柳絮云泡泡
2023/04/07
6590
三种验证类型的https证书
[Nature Machine Intelligence | 论文简读]三种类型的增量学习
从非平稳的数据流中渐进地学习新信息,被称为“持续学习”,是自然智能的一个关键特征,但对深度神经网络来说是一个具有挑战性的问题。近年来,许多用于持续学习的深度学习方法被提出,但由于缺乏一个通用的框架,它们的性能比较困难。为了帮助解决这个问题,作者描述了持续学习的三种基本类型或“场景”:任务增量学习、域增量学习和类增量学习。每一种情况都有自己的挑战。为了说明这一点,作者根据每个场景使用split MNIST和split CIFAR-100数据集,对目前使用的持续学习策略进行了全面的实证比较。作者展示了三种场景在难度和不同策略的有效性方面的显著差异。提出的分类旨在通过形成清晰定义基准问题的关键基础,来构建持续学习领域。
智能生信
2022/12/29
7050
[Nature Machine Intelligence | 论文简读]三种类型的增量学习
Java线程的三种创建方法
1、创建Callable接口的实现类, 并实现cal()方法, 该cal()方法将作为线程执行体,并且有返回值。
背雷管的小青年
2021/02/04
5860
Oracle创建主键的三种方式
从trace我们能看到,对T_PK_02加了share模式锁,指定nowait,先创建的约束,然后创建了唯一索引,
bisal
2021/09/06
2.3K0
Spring创建bean的三种方式
Spring主要从两个角度来实现自动化装配:①组件扫描;②自动装配。组件扫描指的是Spring会自动扫描指定包及其子包下的所有bean,并将其放入spring容器中进行管理,而自动装配则是指对于有相互依赖关系的bean,Spring会将其自动装配到目标bean中,如将repository层的bean自动装配到service层中。
田维常
2019/07/20
4K0

相似问题

如何使用XML创建三种以上颜色的渐变

24

如何使圆形视觉对象的面积均匀地分成三种或三种以上的颜色?

18

REST设计:在哪里创建依赖于其他资源的资源?

13

拉链三种不同类型的单体

25

是否可以在LINQ中创建三种不同的条件,并有三种不同的结果?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文