资源的angular度斜线

我的api需要api调用的尾部斜线。 我想知道如何用angular度来解决这个问题。

所以我需要能够访问/tasks/或一个/tasks/xxxx/. 我试图通过:

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

和a

 $scope.tasks = Tasks.query(); 

但它会导致/taskstasks/xxx查询。

我如何强制它总是/tasks//tasks/xxx/

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

你现在可以这样configuration它:

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

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

正如前面提到的问题所述, $resource工厂对符合特定规范的RESTful端点来说是非常好的。 虽然$resource在符合本规范的后端方面会做很好的工作,但是它有一些限制,可能会对不遵守$resource预期的合同的后端进行排除。 在这种情况下,最好的方法是切换到使用下面的$http服务,如在这个问题中提到的: 推荐的方式从服务器获取数据

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

在url模板的最后端添加一个空格(在angular 1.2.0下testing):

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

在Chrome和Safari上添加2个反斜杠以避开URL上的尾部斜线。

然而,Firefox决定从URL中删除尾部斜杠并将反斜线编码为正斜杠到%5C的好处:伟大的:-)所以在上面的例子中你会得到http:// example .com / controller / save%5C ,然后404s在服务器上。

我正在使用Django + TastyPie作为我的项目,并且需要在URL上使用尾部的斜杠,我将会修改ngResource,而不是像任何一个最低公分母那样下降到$ http。

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

人们可以使用HTTP截取所有或特定的url,例如apiurl:

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

作为解决这个问题的方法,直到/如果他们改变了AngularJS源代码,我设置了一个.htaccess重写规则来为所有到web服务器的请求添加一个尾部的斜线。

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

这种方法的缺点:

  • RESTful呼叫的networkingstream量得到301redirect,所以你看到请求被发送两次
  • 这只适用于GET请求(注意在我的例子中的限制),如果重写接收POST,DELETE,PUT请求和redirect,它作为一个GET请求相同的URL,这可能不是你想要的当然,因为你失去了有效载荷。

在编写最终的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}}); }); 

文森特逃避了最后的斜线(在URL的末尾添加两个反斜杠和一个正斜杠(http://example.com/controller/save\\/))为我工作。