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

在REST中提供HTML应用程序页面和JSON数据,json,rest,http,content-negotiation,http-accept-header,Json,Rest,Http,Content Negotiation,Http Accept Header,在RESTful应用程序中,使用“资源”URL提供JSON数据和访问数据的页面是否是一个好主意?如果没有,我应该如何区分这两件事 假设我有一个页面/routes,我有一个页面列出所有路由。我应该这样做: HTML页面 这似乎是错误的,因为这两个请求指向相同的URL/URI,但返回不同的资源(一个是应用程序页面,另一个是数据)。为Accept:text/html提供这样的服务似乎更合适: GET /routes Accept: text/html Response: <table>

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

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

HTML页面 这似乎是错误的,因为这两个请求指向相同的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>
GET/routes
接受:text/html
答复:
数字起点
奥莱安斯巴黑文中心95号广场
(我可能不会这么做,因为它不是很有用。)

我考虑过几个选择:

  • 如上所述,使用HTTP
    Accept
    标题
  • 使用查询参数(例如
    /routes?type=html
  • 为页面使用不同的路径(例如,数据使用
    /routes
    ,应用程序使用
    /pages/routes
  • 使用扩展(例如,数据使用
    /routes
    ,应用程序使用
    /routes.php
  • 1和2似乎不太正确。我对3不太感兴趣,尽管页面本身就是一种资源,但它并不完全代表应用程序中的一个实体。选项4看起来很难看

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


    有什么想法吗?这个问题不应该主要基于观点,因此参考文献将非常受欢迎。

    第4项看起来是最好的选择,因为HTML页面与API中的资源类型不同。 将页面与API资源分开似乎是个好主意。

    twitter和Facebook的例子也支持这种方法

    您可以使用HTTP Accept标头,这将允许进行运行时内容协商。参考
    但是我更喜欢使用两个单独的URL,比如/routes.json作为json响应,/routes.html作为即用html。

    如果“即用”html指的是我第三块中的代码,我根本不打算提供“即用”html,因为它似乎没有任何用处。我主要关心的是用户的JSON和HTML页面。
    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... */
    ]
    
    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>