REST API和UI网页的URI模式的最佳实践
经过多年的网络编程,我现在开始从头开始编写一个新的Web应用程序。 我学习了REST的一些技巧,并发现了一些有关好的和不好的“URI风格”的helfful演示和网络研讨会。 但是,所有这些教程似乎都假设只有可以映射到数据库中存在的实体的资源。 如果一个人需要GET
一个HTML的东西(人性化)的版本,那么常见的答案是通过HTTP头字段使用内容negiotation。 最终目标似乎只有遵循REST范式的URI。
但是,显示无法映射到实体但仍然需要的网页的“正确”方式是什么?
也许我举个例子来澄清我的意思。 假设我们有一个集合Persons
和实体Person
。
然后我们有
POST /Persons/
在集合中创建一个新人员 DELETE /Person/{id}/
删除该人员 PUT /Person/{id}/
来修改这个人(是的,我知道它也可以意味着创建一个) GET /Persons/
获取GET /Persons/
的名单 GET /Person/{id}/
获取个人 关于GET
操作,我通常会发现使用X-Requested-With
的Accept
和X-Requested-With
头域创建响应的建议,该响应要么以计算机可读的表示方式返回“裸”人对象(即JSON,XML等等),或者为浏览器返回一个完整的网页。
但是PUT
操作是什么。 最终,此操作将发送将要创建的裸人对象(即JSON,XLM),但在此步骤之前,我需要从用户收集数据。 这意味着我需要一些空白的网页表单,这对于用户来说只是“眼睛”。 当然,我可以忍受像GET /newPersonForm/
东西,但它似乎与REST哲学相矛盾,因为/newPersonForm/
是一个只指向某个用户界面元素的URI。
目前我看到的选择:
对这两种URI使用相同的名称空间:
POST /Persons/
- > REST api DELETE /Person/{id}/
- > REST api PUT /Persons/{id}/
- > REST api GET /Persons/
- > REST api或UI(内容忽略后) GET /Person/{id}/
- > REST api或UI(内容忽略后) GET /Person/creationForm
- >非REST,纯UI GET /aboutus
- >非REST,纯UI,额外的公司信息 分别命名空间:
/api/...
- >包含REST的所有内容 /ui/...
- >包含html网页 采用第一种方法时,我觉得这有点“不洁”。 虽然第二种方法看起来更清洁,但我看到两个问题。 首先,如果采用这种方法干净利落,可以获得更多的双重URI,因为不需要内容负担,并且每个REST功能都有一个UI网页。 我有GET /api/Person/{id}/
返回JSON对象, GET /ui/Person/{id}
返回浏览器版本。 其次,我觉得这种方法与REST哲学相矛盾,因为搜索范例和网络爬虫不能理解网站的结构。
任何建议最佳实践是什么?
首先,让我们看看一些误解。
任何你可以通过URI识别语义的东西都是一种资源。
HTTP方法不会映射到这样的CRUD操作。 阅读这个答案了解更多。 我建议你在继续阅读这个答案之前阅读它。 这一个可能也会有帮助。
没有任何遵循REST范式的URI。 REST对URI的唯一约束是它们必须标识一个且只有一个资源,并且它们必须被视为原子标识符。 URI的语义是无关紧要的,尽管显然你应该设计对开发者和用户有意义的URI。
正如您已经想到的那样,返回用户友好表示的正确方法是通过Accept
头进行协商。 不要紧,如果它不是映射到数据库的东西。 这是一个只有服务器知道的实现细节,这就是REST的内容。 当您从REST API检索某些内容时,无论它是来自应用程序服务器,某处缓存还是来自Amazon S3提供的静态文件,甚至是FTP链接。 客户端应该简单地遵循链接,比如当您点击网页上的链接时,您不关心结果来自何处。
你提出的两个选项都是有效的,但这与REST无关。 用api
和ui
来分隔它们是组织事物的好方法,但REST真正重要的是客户端如何获得这些链接。 如果他们通过阅读文档中的URI并填充值来实现客户端,那不是REST。
从网页浏览的角度思考它。 你如何到达那个/newPersonForm
html页面? 你在别的地方跟着一个链接,上面有一个标签告诉你点击它来创建一个新的Person。 如果你是一个点击,它是/newPersonForm
或/forms/newperson
或简单/persons
/forms/newperson
。 REST的工作方式完全相同。
上一篇: Best practice for URI pattern for REST api and UI web pages