【问题标题】:REST doesn't work with Sever-Client-Client setupREST 不适用于服务器-客户端-客户端设置
【发布时间】:2010-05-04 21:07:53
【问题描述】:

我当前的 RESTful api 设计有问题。

我有一个 REST api,由 Django 网络服务器使用,它呈现 HTML 模板。

    REST api 
        > Django webserver
                 > HTML

我遇到的问题是我必须重构所有的 URL,比如

mysite.com/main/cities/<id>/streets/

进入我的网络服务器层上的等效rest api url:

api.com/cities/<id>/streets/

因此,我有很多来回映射,但据我所知,REST 表示客户端(在本例中是我的网络服务器)不需要知道如何重新构建 url。

REST 可以用于这样的设置吗?如何使用?还是仅适用于服务器-客户端架构。

谢谢

【问题讨论】:

    标签: architecture rest


    【解决方案1】:

    我认为你正在尝试做的事情真的很棘手。假设您的 Web 服务器正确使用 HTTP(例如,没有会话状态),您实际上是在尝试将一个 REST 服务放在另一个 REST 服务之上。这意味着您在 Web 服务器级别拥有“应用程序状态”,您需要将其传输到客户端并与实际客户端状态一起管理。想想就头疼。

    我还没有看到这种类型的 REST 服务组合做得太多。然而,Ceasare Pautasso 有一篇关于它的研究论文 here。在他的案例中,他更进一步,使用两个 REST 服务来创建第三个复合服务。

    【讨论】:

    • 感谢您的评论。我的头也很痛 :-) 另请注意 - 我并没有尝试创建从我的中间 Web 服务器(django)到 html 客户端(浏览器)的 RESTful 服务。只是想成为他们之间的一种“调解人”。 PS:到目前为止的论文很棒。我会继续阅读,看看它有什么建议。
    • 嗯...我必须说,这篇论文无非是对“如何用这个很酷的java工具做rest composition”的探索。我宁愿阅读它背后的一般哲学,而不是将这个图标拖到 Eclipse 中并创建一堆箭头。无论如何,谢谢 - 这是一个有趣的阅读。
    • 很抱歉。我认为这篇论文会比这多一点。我刚刚听到 Ceasar 在 WS-REST 会议上发言,他在涵盖该主题方面做得不错。
    • 我意识到您并没有明确地尝试使用您的 Web 服务器创建 REST 服务,但您可能无意中创建了一个。您正在遵守统一接口,您正在使用支持超媒体的标准媒体类型,您的消息是自描述的,并且您的所有资源(网页)都用 URI 标识。只要避免会话状态,网站自然是 RESTful。
    【解决方案2】:

    为什么不让 Web 服务器重写 URL?

    【讨论】:

    • 怎么样?您的意思是仅映射吗?
    • 好吧,请原谅我的简单。您说您需要重建您的 URL,而这通常是 Web 服务器可以处理的。这基本上是从 URL 中删除“/main”,以使它们与您的 REST 客户端兼容。
    • 并不总是一对一的映射。我的 REST 服务可能一次提供 100 项资源的列表,而我可能一次在 HTML 客户端上显示 50 项。我必须做更多涉及的转换。