当集合服务返回字典而不是数组时,如何使用Restangular?

时间:2013-05-31 21:18:57

标签: rest dictionary angularjs

我正处于开发客户端应用程序到现有REST服务的早期阶段,我正在尝试决定使用什么来进行服务器通信。到目前为止,我喜欢Restangular文档,它看起来非常可靠,但我担心它不能与服务一起使用,因为响应看起来像这样:

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

我无法在文档中找到支持这样的内容或者我应该如何处理这种类型的响应。有人试过吗?有什么想法吗?

4 个答案:

答案 0 :(得分: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;
});

有了它,它将起作用:)

请告诉我你是否能解决这个问题

答案 1 :(得分:1)

如果您附加了"那么&#34>你可以这样做。声明你回来的承诺。 也就是说,而不是:

return <RectangularPromise>;

你有这个:

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

基本上,它与@ mgonto的答案相同,但这样做意味着你不必修改你的整个矩形服务,如果你只需要为一个人做这个端点。 (虽然,另一种避免这种情况的方法是创建服务的多个实例,如自述文件中所述)。

答案 2 :(得分:0)

遗憾的是listTypeIsArray在自述文件中没有描述,所以我没有尝试过这个选项 但我解决了这里描述的类似问题 https://github.com/mgonto/restangular/issues/100#issuecomment-24649851

答案 3 :(得分: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;
});  });