【问题标题】:How to make $resource accept array of strings (AngularJS)如何使 $resource 接受字符串数组(AngularJS)
【发布时间】:2015-02-19 02:19:25
【问题描述】:

我想向查询参数包含字符串数组的 REST 服务发出请求:

productRestService.getProductsInfo(productIdsArray,"id,name,rating").$promise.
               then(function(productData) { // success: Produktdaten auslesen                
                    updateProductList(productData);

                }, function (error) {
                    console.log("Status: " + error.status);       
                });

资源服务如下:

productRestService.getProductsInfo = function(productIds, properties) {
        console.log('productRestService.getProductsInfo(): productIds' + productIds);
        var productInfoResourceData;
        var ProductInfoResource = $resource('/rest/products/productsInfo/:productIds/:properties',
            {
                productIds:'@productIds',
                properties:'@properties'
            }
        );
        productInfoResourceData = ProductInfoResource.query(
            {
                productIds: productIds,
                properties: properties
            }
        );
        return productInfoResourceData;

    }

调用服务会导致 404 错误,因为 $resource 对象的默认行为是在使用“查询”时它需要一个对象数组。

我怎样才能让我的 $resoure-service 接受一个字符串数组?我尝试使用“transformRequest”(参见下面的 sn-p),但这也不起作用。

  {
                query: {
                  method: 'GET',
                  isArray: true,
                  transformResponse: function (data, headers) {
                    var tranformed = [];
                    [].forEach.call(eval(data), function (d) {
                        tranformed.push({ name: d });
                    });
                    return tranformed;
                    }
                }
            }

REST 服务 productService.getProductsInfo 函数中的 console.log 显示了服务接收到的正确数据:

["212999cc-063b-4ae8-99b5-61a0af39040d","17e42a28-b945-4d5f-bab1-719b3a897fd0","9307df3e-6e7a-4bed-9fec-a9d925ea7dc0"]

该 URL 与其他 REST-URLS 是正确的,应该是这样的(并相应地连接到域):

'/rest/products/productsInfo/:productIds/:properties'

编辑: productService 中的其他函数按顺序响应,它们不使用数组而是使用 JSON 对象,并且不会显示意外行为。

【问题讨论】:

  • 困惑;我想 404 是由于构造了一个无效的请求 URL 而导致的——与响应无关(我想 transformResponse 甚至从未被调用过)。您能否提供正在构建的 URL 以及您希望 URL 的外观?
  • 我用 cmets 和您请求的 URL 编辑了我的问题。将请求命令中的参数“productIdsArray”类型从数组更改为 JSON(使用 JSON.parse)可解决 404 错误,但我不查询任何数据。
  • 您提供的是 URL 模板,而不是 URL。就像@Daniel 提到的那样,您还应该提供一个手动构建的 URL 来显示您希望 URL(而不是模板)的外观,更重要的是,服务器期望它的外观。

标签: arrays angularjs angular-resource


【解决方案1】:

(这最初是一条注释,但它需要格式清晰的代码示例。)

我怀疑您的:productIds 模板参数正在作为"[object Object]" 填充到模板中。我只看到了您的模板 URL,而不是实际构建的 URL,所以我不能确定。

如果您的服务器需要一个 :productsIds 模板参数为 JSON 的 URL,例如 ---

rest/products/productsInfo/["id1","id2","id3"]/{"prop1":true,"prop2":false}

--- 然后尝试将您的 getProductsInfo 定义编辑为如下内容:

productRestService.getProductsInfo = function (productIds, properties) {
    var ProductsInfo = $resource('/rest/products/productsInfo/:productIds/:properties', {
        productIds: function () {
            return angular.toJson(productIds);
        },
        properties: function () {
            return angular.toJson(properties);
        }
    });
    return ProductsInfo.query();
}

(公平警告,我没有测试此代码。这只是对您的示例的快速编辑。)

这样,您可以确保参数值转换为服务器期望的 JSON(如果服务器期望 URL 中的 JSON)。

【讨论】:

  • 感谢您的回答和帮助!如何获取 REST 调用的实际构造 URL?
  • 你的解决方案带来了更多的输出,但是传递的数据是很多数据:[object Object],[object Object],[object Object],true 那些对象应该是数组而不是数组对象。我如何转换这些? “angular.toArray”似乎不起作用。
  • @Pille,不幸的是,我不确定获取构造的 URL。当我看到你的问题时,我花了几分钟研究它,但我没有找到任何东西。关于新的输出,如果您不再收到服务器的 404 错误,并且现在正在接收包含数据的响应,则此特定问题可能已得到解决,您可能想提出一个新问题。确保包含足够的详细信息(请求逻辑、检索到的数据的详细描述/格式与所需数据等),以便更轻松地为您提供帮助。
  • 我了解到使用 CHROME 可以通过检查“网络”状态来获取构建的 URL。但是,您对问题的类型是正确的,因为它现在已经改变了。我不再收到 404 错误,将按照您的建议进行操作。再次,非常感谢。
  • @Pille,啊,真好,我有点尴尬,我没有意识到 DevTools 中的“网络”选项卡会有 :-) 很高兴知道。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2014-05-16
相关资源
最近更新 更多