0

API リクエストのバッチを単一のリクエストの一部として実行できるようにするサーバー側 API メソッドを実装しようとしています。バッチ内の各リクエストのレスポンスはJSONArray、クライアントに返される にラップされます。

本質的に、クライアントは次の行に沿って「バッチ」パラメーターを使用してサーバーを呼び出します。

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

これは、2 つの 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'?
}

すべてが正常に機能します (バッチ処理されたすべての要求が実行され、サーバーがそれらを正しく処理します) が、結果配列に追加できるように、含まれている応答を取得する方法がわかりません。

何か案は?

4

1 に答える 1

2

個々のリクエストを処理するときは、まずサーブレット スタックを通過しないようにします。一部のビジネス メソッドを直接呼び出すことはできませんか? ディスパッチとパラメーターの解析ロジックを再利用したいのはありがたいのですが、その部分はそれほど複雑ではないかもしれません。

それが不可能な場合はrequest.setAttribute("theResult", jsonData)、個々のハンドラーに a を追加して、結果のテキストを確認する必要がなく、データをより簡単に取得できるようにすることができます。

それでも応答ストリームを見たい場合は、ResponseWrapper を作成する必要があります。たとえば、この質問をチェックしてください。

于 2011-06-30T02:41:34.010 に答える