34

我的 api 需要用于 api 调用的斜杠。我想知道如何用角度来解决这个问题。

所以我需要能够访问/tasks//tasks/xxxx/. 我试图通过以下方式进行:

angular.module('taskServices', ['ngResource']).
        factory('Tasks', function($resource){
            return $resource('/tasks/:task_id/', {}, {
                 query: {method:'GET', 
                         params:{},
                         isArray:true}
            });
 });

和一个

$scope.tasks = Tasks.query(); 

但它会导致一个/tasks或一个tasks/xxx查询。

/tasks/我怎么能强迫它永远存在/tasks/xxx/

4

9 回答 9

65

这似乎已经修复:https ://github.com/angular/angular.js/pull/5560

您现在可以这样配置它:

app.config(function($resourceProvider) {
  $resourceProvider.defaults.stripTrailingSlashes = false;
});
于 2014-06-10T13:02:02.790 回答
35

在这行AngularJS 源代码中,尾部斜杠被显式删除。我不完全确定此代码背后的基本原理是什么,但已经为此打开了一个问题:https ://github.com/angular/angular.js/issues/992

如上述问题所述,$resource工厂非常适合符合特定规范的 RESTful 端点。虽然$resource与符合本规范的后端交谈会做得很好,但它有一些限制,可能会将它排除在不遵守$resource. 在这种情况下,最好的方法是切换到使用$http此问题中指出的较低级别的服务:从服务器获取数据的推荐方式

$http是一项非常强大且灵活的服务,允许完全控制 URL、发送的参数等。

于 2013-01-26T11:19:20.307 回答
20

在 url 模板的最后添加一个空格在这里有效(使用 angular 1.2.0 测试):

{url: '/user/:id/ '}
于 2013-10-19T06:49:44.617 回答
6

添加 2 个反斜杠来转义 URL 上的尾部斜杠在 Chrome 和 Safari 上对我有用。

然而,Firefox 认为从 URL 中删除尾部斜杠并将正斜杠转义为 %5C...great 的反斜杠编码是一个好主意:-) 所以在上面的示例中,您会得到http://example .com/controller/save%5C,然后在服务器上执行 404。

我在我的项目中使用 Django+TastyPie 并且需要 URL 上的尾部斜杠,我将寻求修改 ngResource 而不是将所有内容都降为 $http 作为最低公分母。

于 2013-05-21T09:12:07.970 回答
2

对于使用django-rest-framework 的AngularJS 客户端,只需使用angular-django-rest-resource。工作得很好。

于 2014-04-08T10:55:40.153 回答
1

可以对所有或特定 url 使用 http 拦截器,例如 api url:

app.factory('myHttpInterceptor', function ($q) {
    return {
        'request': function(config) {
            if (config.url.indexOf('/api/') != -1 && config.url.slice(-1) != '/') {
                config.url += '/';
            }
            return config || $q.when(config);
        }
    };
});

app.config(function($httpProvider) {
    $httpProvider.interceptors.push('myHttpInterceptor');
});
于 2014-04-10T11:04:56.283 回答
0

作为解决此问题的方法,直到/如果他们更改了 AngularJS 源,我设置了一个 .htaccess 重写规则,为所有传入网络服务器的请求添加一个尾部斜杠。

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteCond %{REQUEST_METHOD} GET
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

这种方法的缺点:

  • RESTful 调用的网络流量被 301 重定向,因此您看到请求被发送了两次
  • 这仅适用于 GET 请求(请注意我的示例中的限制),如果重写接收 POST、DELETE、PUT 请求和重定向,它会作为相同 URL 的 GET 请求,这当然可能不是您想要的,因为你失去了你的有效载荷。
于 2013-07-02T00:46:47.193 回答
0

在编写最终 url 之前,我可以通过将其添加到 ngResource 来解决 Firefox 编码问题:

url = url.replace(/\\/,"/");

这允许 Chrome/Safari 的斜线转义修复在 Firefox 上运行良好。

app.factory('Things', function($resource){
        return $resource('/api/v1/thing\\/', {}, {
              query: {method:'GET', params:{},isArray:true}});
        }); 
于 2013-08-13T20:48:30.233 回答
-2

文森特对尾部斜杠的转义(在 URL 的末尾添加两个反斜杠和一个正斜杠 (http://example.com/controller/save\\/))对我有用。

于 2013-05-20T22:26:16.730 回答