【问题标题】:How should i use ngResource with a specific response body?我应该如何将 ngResource 与特定的响应主体一起使用?
【发布时间】:2026-01-14 08:55:02
【问题描述】:

我的回复正文如下所示:

{
   "code": 200,
   "message": Items succesfully retrieved,
   "items": [ 
              {
                 ... 
              }
            ]
}

我之前使用的是 $http,所以我没有遇到这个问题,但我决定切换到 ngResource,因为它看起来更好。而且我确定我做错了,所以如果你能告诉我如何将“项目”(在这个例子中)定位为返回的对象(对于 put、post、...)

这是我为试用 ngResource 而编写的代码示例

app.factory("Product", function($resource,APILINK) {
  return $resource(APILINK+"/api/v1/products/:id", {id: '@id'}, {
     query: {method: 'GET',
  isArray: false
  },
  update: { method: 'PUT' }
  });
});

我真的不知道这是否是构建发送代码和消息的 REST Api 的好方法。但是这样感觉更干净:'(

我需要修改 REST Api 发送的 json 吗?或者有没有办法让 ngResource 忽略响应正文中的“代码”和“消息”?

【问题讨论】:

  • 您的“响应正文”,包含代码、消息和项目数组本身是一个对象吗?如果是,您可以只发布/放置该对象,然后以这种方式检索 Items 数组。

标签: javascript angularjs node.js rest ngresource


【解决方案1】:

在您的数据传输 (json) 对象中设置状态代码和消息可能不是可行的方法。是否需要访问状态码?

The documentation on $resource 内容如下:

  • HTTP GET“类”操作:Resource.action([parameters], [success], [错误])
  • 非 GET “类”操作:Resource.action([parameters], postData, [成功], [错误])
  • 非 GET 实例操作: instance.$action([参数], [成功], [错误])

所以,每个 $resource 调用都会给我们一个成功和错误回调。 例如:

var Product = $resource('/api/as/product');

Product.query(function(items) {
   // success handler
}, function(error) {
   // error handler
});

您可能无法读取状态码,但您知道呼叫是否成功。

或者,如果必须获取状态码,您可以查看拦截器:

// Resource
var Product = $resource(url, {}, {
   get: {
       method: 'GET'
       interceptor: {
           response: function(response) {      
               var result = response.resource;        
               result.$status = response.status;
               return result;
           }
       }
   }                            
 });

 // Caller
 Product.get(params, function(result) {
    console.log('status code: ' + result.$status);
 });

当调用这个资源时,我们会截取结果,从响应中添加状态码,然后返回给调用者。

【讨论】:

  • 谢谢!正是我想要的:拦截器!
【解决方案2】:

当您引用 getput 以及其他 REST 动词时,您可以指定 items 对象。

GET 示例:

var itemList = Product.query({ id: 12345 }).items;

PUT 示例:

var MyItemList = {
    "code": 200,
    "message": "Items succesfully retrieved",
    "items": [ { ... }, { ... }, { ... } ]
}

Product.update({ id: 12345 }, MyItemList.items);

虽然如果您只是从第一个示例中发送 itemList,但您已经将其范围缩小到 items[] 数组,其中不包括 codemessage

【讨论】:

    最近更新 更多