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 的答案相同,但这样做意味着如果您只需要为一个端点执行此操作,则无需修改整个 Rectangular Service。(虽然,另一种避免这种情况的方法是创建自述文件中概述的服务的多个实例)。

于 2013-09-11T05:50:36.453 回答
0

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

于 2013-09-18T09:15:06.097 回答
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 回答