资源的角度尾部斜杠

时间:2013-01-26 02:10:41

标签: angularjs

我的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(); 

但它导致/taskstasks/xxx查询。

如何强制它始终为/tasks//tasks/xxx/

9 个答案:

答案 0 :(得分:64)

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

您现在可以这样配置:

app.config(function($resourceProvider) {
  $resourceProvider.defaults.stripTrailingSlashes = false;
});

答案 1 :(得分:34)

在AngularJS源代码的this line中显式删除了尾部斜杠。我不完全确定这段代码背后的理由是什么,但已经有一个问题:https://github.com/angular/angular.js/issues/992

如上所述,$resource工厂非常适合符合特定规范的RESTful端点。尽管$resource能够很好地与符合此规范的后端进行对话,但它有一些限制,可能会为不符合$resource预期合同的后端进行排除。在这种情况下,最好的方法是切换到使用较低级$http服务,如此问题中所述:Recommended way of getting data from the server

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

答案 2 :(得分:20)

在网址模板的最后添加一个空格在这里工作(使用角度1.2.0进行测试):

{url: '/user/:id/ '}

答案 3 :(得分:6)

添加2个反斜杠以逃避在Chrome和Safari上为我工作的URL上的尾部斜杠。

然而,Firefox确定从URL中删除尾部斜杠是一个好主意,并将正斜杠转义为%5C的反斜杠编码...很棒:-)所以在上面的例子中你会得到{{ 3}},然后404s在服务器上。

我正在为我的项目使用Django + TastyPie,并且需要在URL上使用尾随斜杠,我将寻求修改ngResource而不是降低到$ http作为最低标准的所有内容。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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');
});

答案 6 :(得分:0)

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

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

这种方法的缺点:

  • RESTful呼叫的网络流量获得301重定向,因此您可以看到请求被发送两次
  • 这仅适用于GET请求(请注意我的示例中的限制),如果重写接收POST,DELETE,PUT请求和重定向,它会作为同一URL的GET请求,这可能不是您想要的当然,因为你失去了你的有效载荷。

答案 7 :(得分:0)

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

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

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

app.factory('Things', function($resource){
        return $resource('/api/v1/thing\\/', {}, {
              query: {method:'GET', params:{},isArray:true}});
        }); 

答案 8 :(得分:-2)

Vincent正在逃避斜杠(在URL的末尾添加两个反斜杠和正斜杠(http://example.com/controller/save\\/))为我工作。