java - Servlet - 如何 include() 资源并以字符串形式获取其响应?

标签 java servlets requestdispatcher

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

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

[{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'?
}

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

有什么想法吗?

最佳答案

在处理各个请求时,我首先会尝试避免遍历 servlet 堆栈。直接调用一些业务方法就不行吗?我很高兴您想重用调度和参数解析逻辑,但也许这部分并不是很复杂。

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

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

关于java - Servlet - 如何 include() 资源并以字符串形式获取其响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6529388/

相关文章:

Java JFrame,不立即显示内容,但在最小化+恢复后显示

java - Hibernate/JPA @PoSTLoad 注释是否标记对象 "dirty"?

java - 同一笔交易能否保证数据可见性

java - RequestDispatcher.forward 到媒体文件?

java - JSP Out.Println() 无法解析,使用 Maven 的 WebApp 原型(prototype)创建的项目

java - 当前 Servlet 中的 TDD 方法是否可以优化?

java - 如何将 servlet 请求分派(dispatch)到 Jersey 资源方法

java - 异常启动过滤器 struts2 - 尝试添加 JAR,但结果相同

spring-mvc - org.springframework.web.servlet.PageNotFound noHandlerFound;警告 : No mapping found for HTTP request with URI in DispatcherServlet

java - 为什么我的 java 程序会崩溃?