即使我提供了替代的放置和删除(c.f. )(“低REST"),我如何为从浏览器访问我的web服务的用户提供用户友好的表单验证,同时仍然公开RESTful URI?表单验证问题(下面描述)是我当前的难题,但我想问的更广泛的问题是:如果我试图同时提供一个RESTful公共接口和一个非javascript接口,它会使生活变得更简单还是更困难?他们一起玩吗?
理论上,这应该仅仅是一个改变输出格式的问题。机器可以查询URL "/people",并获得XML中的人员列表。人类用户可以将浏览器指向同一个URL,并得到一个漂亮的HTML响应。(我正在使用来自微格式wiki的URL示例,这似乎相当合理)。
创建一个新的person资源是通过对"/people“URL的POST请求来完成的。为了实现这一点,人类用户可以首先访问"/people/new",这将返回用于创建资源的静态HTML表单。该表单有method=POST和action="/people“。如果用户的输入是有效的,这会很好,但是如果我们在服务器端进行验证并发现错误怎么办?友好的做法是返回表单,填充用户刚才输入的数据,加上一条错误消息,以便他们能够修复问题并重新提交。但是我们不能将输出直接从POST返回到"/people“,或者它破坏了我们的URL系统,如果我们将用户重定向回"/people/new”表单,那么就无法报告错误并重新填充表单(除非我们将数据存储到会话状态,这将更少RESTful)。
有了javascript,事情就容易多了。只需在后台完成POST,如果失败,则在表单顶部显示错误。但是,当javascript支持不可用时,我希望应用程序能够优雅地退化。目前,我被引导得出结论,一个重要的web应用程序不能在没有javascript的情况下实现RESTful接口,并且使用传统的HTML方案(如微格式wiki描述的)。如果我错了,请告诉我!
有关堆栈溢出的相关问题(这两个问题都不涉及表单验证):
发布于 2009-08-12 20:20:24
您可以让html表单直接发布到/people/new。如果验证失败,请使用适当的信息重新编辑表单。如果成功,则将用户转发到新URL。这与我所理解的REST体系结构是一致的。
我看过你对Monis Iqbal的评论,我不得不承认我不知道你所说的“不RESTful”是什么意思。REST体系结构从URL中唯一要求的是它是不透明的,并且它与资源是唯一配对的。REST不在乎它看起来是什么样子,里面是什么,怎么用,用了多少,或者其他类似的东西。URL的可见设计由您决定,REST没有任何意义。
发布于 2009-08-13 04:53:42
为什么要使用XML创建第二个"API“?
HTML包含用户需要查看的数据。HTML相对容易解析。类属性可以像微格式一样用于添加语义。HTML包含表单和链接,以便能够访问应用程序的所有功能。
为什么要创建另一个提供完全无语义的应用程序/xml的接口,该接口可能不包含超媒体链接,因此现在必须将urls硬编码到客户端,从而造成严重的耦合?
如果您可以让您的应用程序在不需要存储会话状态的情况下使用HTML,那么您已经有了一个RESTful API。不要试图设计一堆符合某人对标准的想法的URL。
这是罗伊·菲尔丁的报价,
REST不能定义固定的资源名称或层次结构。
我知道这与你所见过的几乎每一个休息的例子都相反,但那是因为它们都是错误的。我知道我开始听起来像一个宗教狂热者,但看到人们在设计RESTful API时,他们一开始就完全错了,这让我很难过。
听布雷顿的话,他说“休息不关心网址是什么样子”,@Wahnfrieden很快就会告诉你同样的事情。对于试图休息的人来说,这个微格式页面是个糟糕的建议。我并不是说对于创建其他类型HTTP的人来说,这是一个糟糕的建议,而不是一个RESTful API。
发布于 2009-08-12 19:16:03
为什么不使用AJAX在客户端完成工作,如果禁用javascript,那么就设计html,这样传统的POST就可以工作了。
https://stackoverflow.com/questions/1269816
复制