我正在尝试构建一个(主要是) Restful 服务,但我在设计的一部分上遇到了困难。我们公开各种资源,在服务器端看起来像:
public class Thing1 : Resource {
public string ABC {get;set;}
public string DEF {get;set;}
}
Resource 是一个基类:
public class Resource {
public List<Link> Links {get;set;}
}
反过来,Link 只是绑定(bind) rel 和 uri。这样,每个 Resource 都有指向其他资源等的链接,并且消费者可以浏览该服务提供的各种资源。
一些(但不是全部)资源是可编辑的,因此消费者将检索资源,对其进行更改,然后将这些更改PUT 返回给服务。当然,此时服务将根据需要执行验证(并处理任何并发问题)。
但是,一如既往,如果消费应用程序能够在尝试 PUT 请求之前预先执行一些验证,以减少不必要的往返(以几乎相同的方式我们可能会使用 javascript 验证,即使服务器必须重复它)。
因此,我想在我们的响应中包含一些验证信息,以便消费应用程序知道(例如)ABC 不能超过 6 个字符。应该注意的是,目前,消费者可以使用相同的资源类(它们在单独的程序集中,以及适当的 MediaTypeFormatter 类) - 添加属性(例如 System.ComponentModel.DataAnnotations.RequiredAttribute )感觉不对,因为消费应用程序最终会像他们获取共享程序集时那样进行验证,而不是现在在服务中。
还有一些验证更多地基于策略,其中实际验证属性直到运行时才能计算。
tl;dr;
什么是在 REST 响应中包含“有用”验证信息以及实际资源的好设计,以便消费应用程序可以构建良好的用户体验?
最佳答案
也许是这样的
> GET /api/Thing/1
< 200 OK
< Content-Type: application/vnd.acme.resource+xml
<resource>
<ABC>blah</ABC>
<DEF>blurg</DEF>
<links>
<links rel="help" href="/api/help/things"/>
<links rel="http://acme.com/rels/validationrules" href="/api/validationrules/things"/>
</links>
</resource>
> GET /api/validationrules/things
< 200 OK
< Content-Type: application/vnd.acme.validationrules+xml
<rules resourceType="thing">
<property name="ABC" MaxLength="6"/>
<property name="DEF" MaxLength="8"/>
</rules>
我在自己的 API 中做了类似的事情。不幸的是,据我所知,没有标准的媒体类型试图解决这一特殊需求。我怀疑尝试定义这种类型的媒体类型会导致“厨房水槽”效应,每个人都有不同的要求,他们都被扔进去,最终结果对每个人来说都太复杂了。
但是,定义您自己的媒体类型以满足您的特定需求可能是一个非常易于管理的挑战。
在我看来,此解决方案的重要之处在于 /api/validationrules/things 应该很少更改,因此可以由客户端私下缓存。这意味着客户只需极少的成本就可以将此信息作为独特的资源进行检索。
关于c# - 向 REST 响应添加验证信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15404859/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport: