RESTful 设计似乎提倡扁平化或浅层结构化表示(至少当资源以 XML 表示时)。资源表示应仅包含 URI 标识的资源。我想知道什么时候在父资源中呈现资源的子资源是明智的?
要详细说明,请考虑以下内容: 公司可能有多名员工。通常这种情况可能被设计为两个独立的资源,即公司和员工,其中员工将是公司的子资源。
/company/acme/
/company/acme/employees/
/company/acme/employee/john
使用此 URI 设计,公司表示应包含指向其员工的链接,但 XML 表示可能不会包含员工本身。
因此,什么时候通过父级呈现子项才有意义?在某些情况下,仅通过其父级呈现子项目是否明智。我的意思是根本没有子项的 URI。只能通过父资源访问它们。
<company>
<name>Acme</name>
<employees>
<employee>John</employee>
<employee>Jack</employee>
</employees>
</company>
只提供一种方法来访问资源是否明智:如果父项公开其子项,子项是否也可以有一个显式 URI?因此,如果公司的 XML 包含公司的员工,那么提供/company/acme/employees URI 是否有意义,尽管您可以通过公司资源获取相同的信息?
最佳答案
如果子资源仅在其父资源的上下文中有意义,那么是的,它应该嵌套在其父资源中返回。例如,在 HTML 中,一个 <li>元素本身作为子资源没有意义。
但是,如果资源可以独立存在,并且您想要独立于任何其他资源来操作资源,那么它应该有自己的 URI。这样,您可以 POST 或 PUT 到该资源而不会影响其他相关资源,也不必将它们鹦鹉学舌回服务器。如果您必须从父级操作所有内容,请考虑如果一个人执行 GET,修改一个子项,然后对整个内容执行 PUT 并更改该子项,会发生什么情况;如果其他人同时更改了其中一个怎么办?然后您需要添加锁和事务语义,这破坏了 REST 的整个无状态。
至少对于 GET 请求,拥有某种形式的批量查询接口(interface)可能是一个好主意,客户端可以通过该接口(interface)一次获取大量资源;必须为每个资源执行新的 HTTP 请求可能会花费很长时间,因为这意味着每个 GET 都需要通过网络进行新的往返。拥有批量更新功能可能也很有意义。但是,如果您希望一次能够操作一个资源,则需要为该资源提供一个 URI。
是的,拥有不止一种访问资源的方式是非常好的。你可以把它想象成一个博客;您可以在主页上或存档页面上或通过访问它们的永久链接来获取故事。
编辑:如果您想批量更新而不遇到让一个客户端向服务器提供陈旧数据的问题,您基本上有两个选择:
这些都有优点和缺点。锁定的问题在于它是有状态的,因此不太适合 REST 架构。如果客户端程序在拥有锁时崩溃或以其他方式终止,那么该数据将被永久锁定,除非您有某种锁超时,这可能会变得棘手。如果客户端正在执行某种涉及多个锁的奇特事务,则锁定也可能导致死锁。
乐观并发的问题在于,如果数据集上的负载很高,并且有很多客户端同时更改它,则在给定客户端可以发布其数据之前可能需要很多很多次尝试;事实上,一个慢速客户端可能最终完全无法发布更新,因为其他客户端不断更改数据,这意味着慢速客户端更改总是失败。
您需要自己决定哪些选项适合您。这些问题在更改单个资源时也会出现(一个更新可能会破坏另一个),但是当您将资源聚合到一个批量界面中时,它们会更频繁地出现。这就是为什么我建议您使用两个接口(interface),如果您要聚合资源的话;一种是可以单独访问资源,另一种是可选的批量接口(interface),可以一次读取和写入许多资源。
关于xml - 何时在 RESTful 资源表示中包含子项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/701273/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在
我几天前在我的rubyonrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag
我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我
我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params
我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::
我有:sprintf("%02X"%13)哪些输出:=>"OD"我希望我的输出是:=>"%0D"我试过:sprintf("\%%02X"%13)但我得到一个错误警告:格式字符串的参数过多。这同样适用于:sprintf("%%02X"%13)是否可以单独在sprintf中添加前导%? 最佳答案 文字%必须转义为%%:sprintf('%%')#=>"%"此外,您应该使用sprintf或%,而不是两者:sprintf('%%%02X',13)#=>"%0D"#^#commahere'%%%02X'%13#=>"%0D"#^#percen