在REST中提供HTML应用程序页面和JSON数据

时间:2014-08-19 03:47:49

标签: json rest http content-negotiation http-accept-header

在RESTful应用程序中,使用“资源”URL来提供JSON数据和页面来访问数据是一个好主意吗?如果没有,我应该如何区分这两件事?

假设我有一个页面/routes,我有一个页面列出所有路线。我应该这样做:

HTML页面

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. 如上所述使用HTTP Accept标头
  2. 使用查询参数(例如/routes?type=html
  3. 为网页使用不同的路径(例如/routes表示数据,/pages/routes表示应用程序)
  4. 使用扩展程序(例如/routes表示数据,/routes.php表示应用程序)
  5. 1和2看起来不太对劲。即使页面本身就是资源,我也不太热衷于3,它并不完全代表应用程序中的实体。选项4看起来很丑陋。

    我已尝试查看主要网站的功能,并且所有网站都提供来自其他主机/子域的数据(示例:facebook.com / graph.facebook.comtwitter.com / {{1} })这对我​​来说不是一个选择。

    有什么想法吗?这个问题不应该主要以意见为基础,因此非常感谢参考。

2 个答案:

答案 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。