2014-01-20 27 views
7

JavaScript/jQueryを使用して "multipart/mixed; boundary = batch"タイプのレスポンスを処理/解析/読み込みするには?"multipart/mixed; boundary = batch"レスポンスの処理/解析/読み込み方法

応答のこれらの種類を処理する方法はあります:以下に示すよう我々のアプリケーションで

は、我々は、応答を取得しますか?または、正規表現を使用して生の文字列操作を使用して、必要なコンテンツを取得する必要がありますか?

--batchresponse_e3e3tc10-1181-4b94-bb8a-952452769d53 
Content-Type: multipart/mixed; boundary=changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678 

--changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678 
Content-Type: application/http 
Content-Transfer-Encoding: binary 

HTTP/1.1 201 Created 
DataServiceVersion: 1.0; 
Content-Type: application/json;odata=verbose;charset=utf-8 
Content-ID: 1 
X-Content-Type-Options: nosniff 
Cache-Control: no-cache 
Location: <url1> 

{"Some": "JSON response"} 
--changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678 
Content-Type: application/http 
Content-Transfer-Encoding: binary 

HTTP/1.1 204 No Content 
Content-ID: 2 
X-Content-Type-Options: nosniff 
Cache-Control: no-cache 
DataServiceVersion: 1.0; 


--changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678 
Content-Type: application/http 
Content-Transfer-Encoding: binary 

HTTP/1.1 204 No Content 
Content-ID: 3 
X-Content-Type-Options: nosniff 
Cache-Control: no-cache 
DataServiceVersion: 1.0; 


--changesetresponse_4sdflwerf-40ef-4347-8c77-b364e5d2e678-- 
--batchresponse_e3e3tc10-1181-4b94-bb8a-952452769d53-- 
+0

http://stackoverflow.com/questions/3691334/parsing-multipart-mixed-responses-in-jqueryに記載されているプラ​​グインを使用できます – nomier

答えて

4

残念ながら、これを処理するライブラリはありません。ここで私は何をやったのですか。次の解決策は角度とロダッシュ( "_")が利用可能であると仮定していますが、他のフレームワークに適用することもできます。

最初の投稿に表示されているhttpレスポンスがresponseCollectionであることから、最初のヘッダーから境界を見つけます。次に、その境界を使用してレスポンスをコンポーネントに分割します。各コンポーネントでは、最初のインスタンス「{」がJSONの開始を示し、最後のインスタンス「}」が終了とみなされます。 JSONはデシリアライズされ、レスポンスオブジェクトのコレクションにプッシュされます。

これは明らかにすべてのシナリオで機能するわけではありませんし、いくつかの広い前提をしていますが、私の問題を解決するのに十分でした。

function parseBatch(responseCollection) { 
     var items = []; 

     var boundary = getBatchSeparator(responseCollection); 

     var responseLines = responseCollection.data.split('--' + boundary); 

     _.forEach(responseLines, function (response) { 
      var startJson = response.indexOf('{'); 
      var endJson = response.lastIndexOf('}'); 

      if (startJson < 0 || endJson < 0) { 
       return; 
      } 

      var responseJson = response.substr(startJson, (endJson - startJson) + 1); 

      var item = angular.fromJson(responseJson); 

      items.push(item); 
     }); 

     return items; 
    } 

    function getBatchSeparator(response) { 
     var headers = response.headers(); 

     if (!headers['content-type']) 
      return ''; //would probably be bad if this happens, but not sure it ever will. 

     var components = headers['content-type'].split(';'); 

     var boundary = _.find(components, function (o) { return _.startsWith(_.trim(o), 'boundary=') }); 

     boundary = _.replace(boundary, 'boundary=', ''); 

     boundary = _.trim(boundary, '; '); 

     return boundary; 
    } 
1
var boundary= '--batch_'; 
var items = []; 
var responseLines = batchapiresponse.split(boundary); 
$.each(responseLines,function(index, value){ 

    var startJson = value.indexOf('{'); 
    var endJson = value.lastIndexOf('}'); 
    if (startJson < 0 || endJson < 0) 
    { 
     return;    
    } 
    var responseJson = value.substr(startJson, (endJson - startJson) + 1); 
    responseJson=JSON.parse(responseJson); 
    items.push(responseJson); 

}); 

注:これは、jQueryのため@SouthShoreAKから前のコードサンプルに由来します。

すべてのバッチ応答には、境界内の部分文字列として '--batch_'が含まれていることを前提に書かれています。 P.S主にGoogleバッチリクエスト用に書かれています

関連する問題