2

私は既存の REST サービスに対するクライアント アプリの開発の初期段階にあり、サーバー通信に何を使用するかを決定しようとしています。これまでのところ、Restangular のドキュメントが気に入っています。非常にしっかりしているように見えますが、応答が次のようになっているため、サービスで機能しないのではないかと心配しています。

{
  "0": {
    "name": "John",
    "total": 230,
    "score": 13
  },
  "1": {
    "name": "Sally",
    "total": 190,
    "score": 12
  },
  "2": {
    "name": "Harry",
    "total": 3,
    "score": 0
  },
  "...": "..."
}

このようなものがサポートされているかどうか、またはこのタイプの応答をどのように処理する必要があるかをドキュメントで見つけることができません。誰も試したことがありますか?何か案は?

4

4 に答える 4

7

私はRestangularの作成者です:)。

その応答を Restangular で使用できます。responseInterceptor を使用する必要があります。配列を取得しているときの応答はそのように見えると思います。したがって、次のことを行う必要があります。

RestangularProvider.setListTypeIsArray(false)
RestangularProvider.setResponseExtractor(function(response, operation) {
  // Only for lists
  if (operation === 'getList') {
    // Gets all the values of the property and created an array from them
    return _.values(response)
  }
  return response;
});

これで、それはうまくいくでしょう:)

これがうまくいったかどうか教えてください

于 2013-05-31T22:04:42.503 に答える
1

返すプロミスに「then」ステートメントを付ければ、これを行うことができます。つまり、これの代わりに:

return <RectangularPromise>;

あなたはこれを持っています:

return <RectangularPromise>.then(function(response){return _.values(response);};

基本的には@mgontoの回答と同じですが、このようにすることは、1つのエンドポイントに対してのみこれを行う必要がある場合、Rectangular Service全体を変更する必要がないことを意味します. (ただし、これを回避する別の方法は、readme で概説されているように、サービスの複数のインスタンスを作成することです)。

于 2013-09-11T05:50:36.453 に答える
0

RestangularProvider.setListTypeIsArray() は廃止されました。

オブジェクトが必要な場合は、addResponseInterceptor 内で処理します

app.config(function(RestangularProvider) {

// add a response interceptor
RestangularProvider.addResponseInterceptor(function(data, operation, what, url, response, deferred) {
  var extractedData;
  // .. to look for getList operations
  if (operation === "getList") {
    // .. and handle the data and meta data
    extractedData = data.data.data;
    extractedData.meta = data.data.meta;
  } else {
    extractedData = data.data;
  }
  return extractedData;
});     });

文字列の応答が必要な場合は、配列に変換してください。

  app.config(function(RestangularProvider) {
RestangularProvider.addResponseInterceptor(function(data, operation, what, url, response, deferred) {
  var newData = data;
  if (angular.isString(data)) {
      newData = [data]; //covert string to array
    }
    return newData;
});  });
于 2015-12-19T09:31:40.483 に答える