设计:确保响应的呈现与响应的清晰分离

时间:2012-12-03 00:51:01

标签: java rest design-patterns servlets

这是一个设计/模式问题。我有一项服务,现在也需要 作为RESTful Web服务公开。

在现有代码中,我有一个Request的概念,一个套件 可能的ServiceOperations(策略)和任何ServiceOperation的返回是 一个Response对象。这种方法解耦了内部运作 来自演示媒体的服务(自定义TCP服务器,HTTP REST,HTTP SOAP等。)。

我现在已经开始实现MyServiceRESTfulServlet了 像这样:

public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws ServletException, IOException {
    try {
        /* Wrap an http servlet request with an adapter which hides all
         * the messy details of an HttpRequest and exposes a nice interface
         * for working with MyService
         */
        IRequest serviceRequest = new MyServiceRESTfulRequest(httpRequest);

        /* There's nothing HTTP related in this part, it's the exact same
         * code you'd find in other presentation formats. A Response has
         * no idea about HTTP, TCP Servers or the like.
         */
        Response serviceResponse = dispatchRequest(serviceRequest);

        /* A static helper which knows the interface of a Response
         * and can translate that into REST-speak for feeding back via
         * an HttpServletResponse.
         */
        renderRESTfulResponse(serviceResponse, httpResponse);
    } catch (Exception e) {
        throw new ServletExcetion(e);   // Caught by a seperate
                                        // RESTfulErrorServlet
                                        // configured in web.xml
                                        // Rendering an appropriate
                                        // response.
    }
}

我的问题是响应可以是目前的两种之一:

public enum ResponseKind() {
    BINARY, METADATA;
}

对于二进制文件,我的restful响应助手将为元数据呈现一种方式 它需要适当地呈现元数据 - 一个HTML表,一个JSON blob等。

确定哪种类型很容易 - 一个Response对象公开了一个 getOriginalRequest()经过适当的检查后可以强制转换为 MyServiceRESTfulRequest公开.getAcceptablePresentation() - an 枚举:

public enum RESTPresentationKind() {
    HTML, JSON, XML, PROTOBUF_MYSERV_0.1;
}

如何最好地将此渲染代码与Response对象分离。 将来毫无疑问,其他类型的反应将是可能的。原样, renderRESTfulResponse()突袭了Request对象并构建 适当地写出数据。它与两者紧密相连 响应界面(我很好),但它知道要去探索 请求对象也是。

我只是觉得我没有以干净和可维护的方式做到这一点 因为我有这项服务的其余部分。我是每个人的“特殊套管” 可能的响应类型以及每种可能的响应格式。感觉 尤伯杯哈克。

您能否建议以任何方式干净地处理渲染RESTful响应 给出一个与表示无关的Request对象?

1 个答案:

答案 0 :(得分:0)

为什么不在RepsonseKind枚举上实现渲染(枚举实际上是类)还是完全放弃?当你发现自己试图摆脱case / switch语句时,答案通常是组合+重载+命令模式或访问者模式。