Loading [MathJax]/jax/output/CommonHTML/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

复制
相关文章
选项卡
HTML代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>选项卡</title> <link rel="stylesheet" href="css/tab.css" /> </head> <body> <div id="tab"> <ul> <li class="select">视频</li
河湾欢儿
2018/09/05
1.5K0
选项卡TabHost
1.布局 1 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/tabHost" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" > 6
欢醉
2018/01/22
1.6K0
选项卡TabHost
Tab选项卡
实现步骤: 实现静态UI效果 用传统的方式实现标签结构和样式 基于数据重构UI效果 将静态的结构和样式重构为基于Vue模板语法的形式 处理事件绑定和js控制逻辑 声明式编程 模板的结构和最终显示的效果基本一致 1.html结构 <div id="app"> <div class="tab"> <!-- tab栏 --> <ul> <li class="acti
梨涡浅笑
2020/12/02
2.2K0
案例选项卡
案例:实现步骤 1. 实现静态UI效果 用传统的方式实现标签结构和样式 2. 基于数据重构UI效果 将静态的结构和样式重构为基于Vue模板语法的形式 处理事件绑定和js控制逻辑 3. 声明式编程
清出于兰
2020/12/01
1.5K0
案例选项卡
js实现选项卡
选项卡就是点击按钮切换到相应内容,其实就是点击按钮把内容通过display(block none)来实现切换的。
wfaceboss
2019/04/08
2.8K0
选项卡(TabHost)使用
使用方式: 从TabActivity中用getTabHost()方法获取TabHost,然后设置标签内容
李小白是一只喵
2020/04/24
1.8K0
Jq实现简单的选项卡功能
下面我们使用Jquery实现简单的选项卡效果,以下为示例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> ul,li{ padding: 0; margin: 0; } .content{ width: 380px; } .content #div0,#div1,#div2{ border:solid 2px pink;
申霖
2019/12/27
7750
Layui Tab 选项卡
layui-tab layui-tab-title layui-tab-content layui-tab-item
用户5760343
2019/10/24
3.3K0
Labview选项卡之实现被选择选项卡工作
有些时候,我们做界面,需要好多个界面切换。如果是同一个 VI 里界面切换,一般都是选项卡了。切换不同选项卡就切换界面了。
Gnep@97
2023/08/16
7701
Labview选项卡之实现被选择选项卡工作
WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
  在前面一篇文章里面,我们实现了AvalonDock选项卡的动态添加,但是对于选项卡里面的内容,我们并没有实现任何有用的功能。   这篇文章里面,我们将实现对选项卡里面的内容和功能实现自定义。 完整系列   ● 第一部分   ● 第二部分   ● 第三部分 在Git中下载工程源码
全栈程序员站长
2022/09/13
1.6K0
WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
小程序 — 选项卡
(2)将用户点击传过来的index值赋给data中改变当前的索引值activeIndex
Ewall
2018/09/30
1.6K0
小程序 — 选项卡
微信小程序----导航栏选项卡(MUI顶部选项卡)
效果图 WXML <import src="../../template/list.wxml"/> <view class="tui-tabbar-content"> <view class="
Rattenking
2021/02/01
1.6K0
微信小程序----导航栏选项卡(MUI顶部选项卡)
Android开发(9) 选项卡的切换
我们想实现的效果是点击切换的选项卡卡部分,主显示区的内容随之改变。那么我们看下页面布局代码
张云飞Vir
2020/03/13
1.6K0
前端|不用JS就能实现的选项卡
在平时浏览网页时,大家经常会使用选项卡来切换页面,在设计网页的过程中,也常用选项卡来整合内容,美化页面效果。简而言之,选项卡就是设置选项的模块,每个选项卡代表一个活动的区域,点击不同的区域,即可展示不同的内容。
算法与编程之美
2020/05/29
1.9K0
前端|不用JS就能实现的选项卡
Tab选项卡切换效果
好了,今天要推荐给大家的这个js动画效果,基本上每个网站都会出现,就是tab选项卡的切换效果。
大M
2021/08/24
3.3K0
Tab选项卡切换效果
如何将来自 Chrome 网络选项卡的请求复制到 Postman?
你有没有想过是否有一种快速的方法将端点调用从你的DevTools 网络选项卡复制到Postman中?
点火三周
2022/04/22
3.6K0
实用tab选项卡切换
itclanCoder
2023/09/14
2610
实用tab选项卡切换
安卓底部选项卡
腾讯QQ有了更新,在自己的手机上更新了一下,试运行了一段时间,被底部的选项卡给深深的迷住了。于是,有了去做做它的原始冲动与欲望,在历经一个早上的琢磨,终于实现了,贴上来,作为给大家的春节祝福吧,在此,小编给大家拜年了,祝大家在新的一年马上有车,马上有房,马上有钱,马上有对象,同时也对浏览我文章的看客表示深深的谢意!
牛老师讲GIS
2018/10/23
1K0
安卓底部选项卡
关于安卓开发选项卡的实现
选项卡(TabHost)方便的在窗口上设置多个标签页,每个标签页相当于获得一个与外部容器相同大小的组件摆放区域 通过这种方式,可以在一个容器中放置多组件。 创建4个java文件并对应layout 创建主java ,代码 1 package lianxi; 2 3 import com.example.jichu_lianxi.R; 4 5 import android.app.TabActivity; 6 import android.content.Intent; 7 import an
听着music睡
2018/05/18
1.1K0
点击加载更多

相似问题

VBA-从工作簿中将特定列复制并过滤到工作表中。

21

在选项卡中显示具有范围的类别?

11

我想在gsheet的特定选项卡中写入数据。

120

将来自Gsheet的两个不同选项卡的数据组合到主Gsheet中

28

jQuery选项卡脚本中的选定选项卡

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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