【问题标题】:Servlets - How to inlude() a resource and get its response as a String?Servlets - 如何包含()资源并将其响应作为字符串?
【发布时间】:2011-06-30 02:32:01
【问题描述】:

我正在尝试实现一种服务器端 API 方法,该方法允许将一批 API 请求作为单个请求的一部分执行,并将批处理中每个请求的响应包装到返回的 JSONArray 中给客户。

本质上,客户端使用“批处理”参数调用服务器,如下所示:

[{method: "getStatus" userId: "5"}, {method: "addFriend", userId: "5", friendId: "7"}]

这指定了一个由两个 API 调用组成的批处理。我想要做的是执行每一个,并将响应组合成如下内容:

[{status: "success", status: "At work..."}, {status: "error", message: "Friend not found!"}]

为了执行批处理,我反复调用RequestDispatcher.include(),如下所示:

String format = request.getParamter("format");  //carry the requested response format forward for each batched request
JSONArray batchResponse = new JSONArray();
RequestDispatcher dispatcher = request.getRequestDispatcher("/apiContext");
OverridableHttpRequest reusableRequest = new OverridableHttpRequest(request);
JSONArray requests = (JSONArray)JSONValue.parse(request.getParameter("batch"));
for (Object batchedRequest : requests) {
    reusableRequest.reset();  //clear all params and attribs

    //set the parameters to use for this request
    JSONObject requestParams = (JSONObject)batchedRequest;
    for (Object key : requestParams.keySet()) {
        reusableRequest.setParameter(key.toString(), requestParams.get(key).toString());
    }
    reusableRequest.setParameter("format", format);

    LOG.debug("including:  /apiContext?" + reusableRequest.getQueryString());

    //process the request as if it were received normally
    dispatcher.include(reusableRequest, response);  //FIXME:  how to get the response data for this include into 'batchResponse'?
}

一切正常(所有批处理请求都已执行,服务器正确处理它们),但我不知道如何获取包含的响应,以便将其添加到结果数组中。

有什么想法吗?

【问题讨论】:

    标签: java servlets requestdispatcher


    【解决方案1】:

    在处理单个请求时,我会首先尝试避免通过 servlet 堆栈。你不能直接调用你的一些业务方法吗?我很欣赏您想重用调度和参数解析逻辑,但也许这部分不是很复杂。

    如果不可能,也许您可​​以在各个处理程序中添加request.setAttribute("theResult", jsonData),这样您就不必查看文本结果,但可以更轻松地检索数据。

    如果还想查看响应流,则需要创建一个 ResponseWrapper。例如查看this question

    【讨论】:

    • 在这种情况下,我更喜欢通过 servlet 堆栈,因为它处理了相当多的访问/权限检查逻辑,我不想重新实现或折叠到业务方法本身.基本上,每个业务方法都带有一组约束条件,必须满足这些约束条件才能允许对该方法的调用,并且在 servlet 堆栈中存在一些与验证这些约束条件相关的通用代码。无论如何,响应包装器看起来是一个很好的解决方案,但我尝试了它并且响应不断以空字符串的形式返回。有什么想法吗?
    • 别在意作者的最后一点。在尝试访问数据之前,我需要手动调用flush()。问题解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多