在 RESTful 应用程序中,使用“资源”URL 来提供 JSON 数据和访问数据的页面是否是个好主意?如果不是,我应该如何区分这两件事?
假设我有一个页面/routes
,并且我有一个列出所有路线的页面。我应该这样做:
网页
GET /routes
Accept: text/html
Response:
<h1>Routes</h1>
<p>blah blah blah</p>
... <table></table>
<script>
$.getJSON('/routes').done(insertDataIntoTable);
</script>
JSON 响应
GET /routes
Accept: application/json
Response:
[
{"number": "95", "start": "Place d'Orléans", "end": "Barrhaven Centre"},
{"number": "96", "start": "Hurdman", "end": "Kanata"},
{"number": "97", "start": "Bayshore", "end": "Airport/Aéroport"},
/* etc... */
]
这似乎是错误的,因为这两个请求是针对相同的 URL/URI,但返回不同的资源(一个是应用程序页面,而另一个是数据)。为以下内容提供这样的服务似乎更合适Accept: text/html
:
GET /routes
Accept: text/html
Response:
<table>
<thead>
<tr><th>Number</th><th>Start</th><th>End</th></tr>
</thead>
<tr><td>95</td><td>Place d'Orléans</td><td>Barrhaven Centre</td></tr>
<!-- etc... -->
</table>
(我可能不会这样做,因为它不是很有用。)
我想过几个选择:
Accept
如上所述使用 HTTP标头- 使用查询参数(例如
/routes?type=html
) - 为页面使用不同的路径(例如
/routes
用于数据和/pages/routes
应用程序) - 使用扩展(例如
/routes
用于数据和/routes.php
应用程序)
1 和 2 似乎不太对。即使页面本身就是资源,我也不太热衷于 3,但它并不完全代表应用程序中的实体。选项 4 看起来很丑陋。
我尝试查看主要站点的功能,它们都提供来自不同主机/子域的数据(例如:facebook.com
/ graph.facebook.com
,twitter.com
/ api.twitter.com
),这对我来说不是一个选择。
有任何想法吗?这个问题不应该主要基于意见,因此非常感谢您的参考。