在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>
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
标头/routes?type=html
)/routes
表示数据,/pages/routes
表示应用程序)/routes
表示数据,/routes.php
表示应用程序)1和2看起来不太对劲。即使页面本身就是资源,我也不太热衷于3,它并不完全代表应用程序中的实体。选项4看起来很丑陋。
我已尝试查看主要网站的功能,并且所有网站都提供来自其他主机/子域的数据(示例:facebook.com
/ graph.facebook.com
,twitter.com
/ {{1} })这对我来说不是一个选择。
有什么想法吗?这个问题不应该主要以意见为基础,因此非常感谢参考。
答案 0 :(得分:0)
Number 4看起来是最好的选择,因为HTML页面是与API中的资源不同的资源类型。 将页面与API资源分开似乎是个好主意 来自Twitter和Facebook的例子也支持这种方法。
答案 1 :(得分:0)
您可以使用HTTP Accept标头,这将允许运行时内容协商。参考
http://docs.oracle.com/javaee/6/tutorial/doc/gkqbq.html
但是我希望有两个单独的网址,例如/routes.json用于json响应,而/routes.html用于准备使用html。