2011-06-30 12 views
0

クライアントに戻されたJSONArrayにラップされたバッチ内の各リクエストに対する応答で、API要求のバッチを1回のリクエストの一部として実行できるようにするサーバー側APIメソッドを実装しようとしています。 。本質的にはサーブレット - リソースをinlude()してレスポンスを文字列として取得する方法?

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

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

これは、2つのAPI呼び出しに構成バッチを指定します。

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

すべてがうまく機能(:のような、私は繰り返しRequestDispatcher.include()を呼び出しています、バッチを実行するには

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

:私は何をしたい各1を実行して、のようなものに応答を組み合わせていますバッチ処理されたリクエストはすべて実行され、サーバーはそれを正しく処理します)。しかし、結果の配列に追加できるように、含まれているレスポンスをどのように取得するのか分かりません。

アイデア?

答えて

2

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

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

レスポンスストリームをまだ見たい場合は、ResponseWrapperを作成する必要があります。たとえば、this questionをチェックしてください。

+0

私は、ビジネスメソッド自体を再実装したり折りたたんだりしないことを好むと思うアクセス/許可チェックロジックのかなりのビットがあるので、この場合はサーブレットスタックを使います。基本的に各ビジネスメソッドには、そのメソッドへの呼び出しが許可されるために満たされなければならない一連の制約が注釈されており、これらの制約の検証に関するサーブレットスタックにはいくつかの汎用コードがあります。とにかく、レスポンスラッパーは良い解決策のように見えますが、私はそれを試しましたが、レスポンスは空の文字列として戻ってきます。何か案は? – aroth

+0

ライターについての最後のビットを気にしないでください。データにアクセスする前に手動で 'flush()'を呼び出す必要がありました。問題が解決しました。 – aroth

関連する問題