Web services 如何在RESTful web应用程序中映射不同的UI视图?

Web services 如何在RESTful web应用程序中映射不同的UI视图?,web-services,architecture,rest,user-interface,Web Services,Architecture,Rest,User Interface,我正在设计一个web应用程序,它将支持通过浏览器访问的标准UI和基于XML/JSON的web服务的RESTful API。用户代理将能够通过在Accept HTTP头中使用不同的值来区分这些 RESTful API将对文章资源使用以下URI结构示例: GET/article/-获取文章列表 POST/article/-添加新文章 PUT/article/{id}-基于{id}更新现有文章 DELETE/article/{id}-基于{id}删除现有文章 但是,应用程序的UI部分需要支持多个视图,

我正在设计一个web应用程序,它将支持通过浏览器访问的标准UI和基于XML/JSON的web服务的RESTful API。用户代理将能够通过在Accept HTTP头中使用不同的值来区分这些

RESTful API将对文章资源使用以下URI结构示例:

GET/article/-获取文章列表 POST/article/-添加新文章 PUT/article/{id}-基于{id}更新现有文章 DELETE/article/{id}-基于{id}删除现有文章 但是,应用程序的UI部分需要支持多个视图,例如:

标准资源视图 用于提交新资源的视图 用于编辑现有资源的视图 用于删除现有资源的视图,即显示删除确认 请注意,后三个视图仍然通过GET访问,即使它们是通过重载POST处理的

可能的解决办法: 在URI中引入其他参数关键字,这些参数关键字将标识单个视图-即,除上述内容外,应用程序将支持以下URI,但仅支持内容类型:text/html:

GET/article/add-显示用于添加通过GET获取、通过POST处理的新文章的表单 GET/article/123-在通过GET获取的视图模式下显示文章123 GET/article/123/edit-在编辑模式下显示文章123,通过GET获取,通过PUT重载为POST处理 GET/article/123/delete-显示通过GET获取、通过delete作为POST处理的第123条的删除确认 上述更好的实现可能是将add/edit/delete关键字放入GET参数中——因为它们不会更改我们正在使用的资源,所以最好保持所有关键字的基本URI相同

我的问题是: 考虑到每个资源可以有多个视图,请问您如何将上述URI结构映射到为普通用户提供的UI?您是否同意上述可能的解决方案,还是会根据您的经验推荐不同的方法


注意:我们已经实现了一个应用程序,它由一个独立的RESTfulAPI和一个独立的web应用程序组成。我目前正在研究将这两个项目合并在一起的未来项目的选项,即为了减少开销。

我不知道您为什么要将这两个项目合并在一起;虽然这个想法似乎有道理,但我认为它实际上是一个虚假的经济体

视图通常特定于其使用的上下文。事实上,您有两种不同类型的用户和服务,它们都使用相同的HTTP通道,这一点不应该混淆

让他们分开可能现在看起来像是额外的工作,但如果4个月后发生了一些事情,这意味着你需要再次将他们分开,这将是更多的工作。关注点的分离超出了UI/逻辑/数据

只要你的逻辑是集中的,并且是连贯的,那么在我的书中,有两套观点就不是问题


作为折衷方案,您能否为两个视图保留相同的URL结构,但重复,即:一致?

在REST术语中,“备用视图”实际上只是普通的旧资源,因为URI是不透明的。通过从一个链接到另一个链接来发现关系——在本例中;从文章列表,到文章,编辑和删除该文章。这里的关键是,它实际上与您的URI结构无关,即以下内容同样“正确”:

GET /article/123/edit
GET /article/123;edit
答案其实只是品味的问题。如果它们由URI标识,因此可以链接到,那么您就做对了

您将如何映射上述URI 结构到UIs服务于常规 用户,考虑到可能存在 每个资源有几个视图

我将以与HTML应用程序完全相同的方式执行此操作,即提供XML中相同的超链接,以便连接/链接资源视图,以便客户端根据需要在UI中进行跟踪和呈现

e、 g

最后:

你同意可能的结果吗 解决方案如上所述,或者您会 根据需要推荐不同的方法 凭你的经验

我认为您上面的方法是合理的-但是,您肯定应该关注链接关系,而不是URI模式

您可以选择保持“更大的粒度”,避免单独删除甚至编辑XML驱动应用程序的资源;只要不在XML中链接到它们,而是选择在文章资源本身中包含删除/编辑链接和表单,这将与您最初提出的HTML驱动版本一起工作


一般来说,对XML和HTML驱动的应用程序使用相同的资源是一种很好的方法。

嗨,Mike,连接/链接关系绝对是我想要的下一件事
为了得到更多关于我首先考虑的方法的意见。在XML中保持与资源的个别视图的链接也是非常好的一点,这是我没有考虑到的,但它是完全有意义的。非常感谢您如此全面的回答,非常感谢!嗨,Adrian,我想合并这两个部分以减少开销并设计一个通用/模块化系统。分离对于抽象很有效,但这两个部分都在同一个数据集上运行,并且本质上提供相同的功能,因此在这种情况下,合并它们可能是值得的。我将来可能真的需要将它们分开,但这最初将是一个实验平台,旨在测试这个概念。关于一致性方法:这是可行的,但它要么会使API URI中具有方法的URL复杂化,要么会给HTML不支持PUT/DELETE的UI带来问题。
GET /article/foobar

200 OK
Content-Type: application/mytype+xml
....
<link rel="edit" href="/article/foobar;edit" />
....