2

在 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>

(我可能不会这样做,因为它不是很有用。)

我想过几个选择:

  1. Accept如上所述使用 HTTP标头
  2. 使用查询参数(例如/routes?type=html
  3. 为页面使用不同的路径(例如/routes用于数据和/pages/routes应用程序)
  4. 使用扩展(例如/routes用于数据和/routes.php应用程序)

1 和 2 似乎不太对。即使页面本身就是资源,我也不太热衷于 3,但它并不完全代表应用程序中的实体。选项 4 看起来很丑陋。

我尝试查看主要站点的功能,它们都提供来自不同主机/子域的数据(例如:facebook.com/ graph.facebook.comtwitter.com/ api.twitter.com),这对我来说不是一个选择。

有任何想法吗?这个问题不应该主要基于意见,因此非常感谢您的参考。

4

2 回答 2

0

您可以使用 HTTP Accept 标头,这将允许进行运行时内容协商。请参阅 http://docs.oracle.com/javaee/6/tutorial/doc/gkqbq.html
但我更喜欢有两个单独的 url,例如用于 json 响应的 /routes.json 和用于准备使用 html 的 /routes.html。

于 2014-08-19T04:11:34.250 回答
0

数字 4 看起来是最好的选择,因为 HTML 页面与 API 中的资源是不同类型的资源。将页面与 API 资源分开似乎是个好主意。
来自 twitter 和 Facebook 的示例也支持这种方法。

于 2014-08-19T03:56:24.793 回答