4

当资源 uri 有多个子路径时,我在查询 RESTful 资源时遇到问题:

例子 :

.factory('SomeFactory', function ($resource) {
return $resource('/path/subPath/otherSubPath/:id', {}, {
show: { method: 'GET', params: { id: '@id' } }
})
}) ;

当我在控制器中调用 SomeFactory.show 时,我收到服务器响应状态为 400(错误请求)的错误,这是因为浏览器正在寻找 uri:

http://server/path/subPath%2FotherSubPat/id

注意 %2F 替换了 uri 中的 /(斜杠),我在 javascript 中尝试了很多技巧来完成这项工作;但唯一的解决方案是添加以下最后一行 replace(/%2F/gi, '/'); 在 angular-resource.js encodeUriSegment 方法中。

请告诉我这种方法是否正确。

function encodeUriSegment(val) {
  return encodeUriQuery(val, true).
    replace(/%26/gi, '&').
    replace(/%3D/gi, '=').
    replace(/%2B/gi, '+').
    replace(/%2F/gi, '/');
}

谢谢 。

4

3 回答 3

1

似乎您已经遇到了在 github 上打开的这个问题:

https://github.com/angular/angular.js/issues/1388#issue-6979382

建议您采用的方法。就我而言,由于我遇到了与您相同的问题,我更喜欢拥有多个服务(每个子路径一个)而不是修改angular-resource.js- 我更喜欢不修改核心 lib 文件,因为任何更新都会清除这些更改。

希望将设置 uri 编码的标志添加到 Angular 以解决此问题。

于 2014-02-18T14:21:03.467 回答
1

您可以使用 http 拦截器:

module.constant("interceptULRS",
  [new RegExp('.+/path/.*')]);

module.config(['$httpProvider', 'interceptULRS', function($httpProvider, interceptULRS) {
var ENCODED_SLASH = new RegExp("%2F", 'g');
$httpProvider.interceptors.push(function ($q) {
  return {
    'request': function (config) {
      var url = config.url;

      for (var i = 0; i < interceptULRS.length; i++) {
        var regex = interceptULRS[i];
        if (url.match(regex)) {
          url = url.replace(ENCODED_SLASH, "/");

          // end there is only one matching url
          break;
        }
      }

      config.url = url;
      return config || $q.when(config);
    }
  };
});
}]);

请记住,它将拦截所有 URL。

于 2015-08-25T15:50:10.317 回答
0

以@Pavol 为基础,我认为您可以将请求功能缩减为

var ENCODED_SLASH = new RegExp("%2F", 'g');
var request = function (config) {
    var matches = config.url.match(ENCODED_SLASH);
    if (matches && matches.length) {
        config.url = config.url.replace(ENCODED_SLASH, "/");
    }
    return config || $q.when(config);
};

如果您在其他地方不需要 ENCODED_SLASH,并且不在乎“%2F”在 url 中的位置。

随着我越来越多地使用角度资源,我发现使用和理解 $httpProvider.interceptors 变得更加重要。

于 2017-04-10T14:02:46.143 回答