我的 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}
});
});
和一个
$scope.tasks = Tasks.query();
但它会导致
/tasks
或 tasks/xxx
查询。
我怎样才能强迫它永远是
/tasks/
和/tasks/xxx/
这似乎已修复:https://github.com/angular/angular.js/pull/5560
您现在可以这样配置:
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 进行测试):
{url: '/user/:id/ '}
添加 2 个反斜杠以转义 URL 上的尾部斜杠,这对我在 Chrome 和 Safari 上有效。
然而,Firefox 认为从 URL 中删除尾部斜杠并将转义正斜杠的反斜杠编码为 %5C...太棒了 :-) 所以在上面的示例中,您会得到http:/ /example.com/controller/save%5C,然后在服务器上进行 404 处理。
我的项目使用 Django+TastyPie,并且需要 URL 上的尾部斜杠,我将寻求修改 ngResource,而不是将所有内容都降至 $http 作为最低公分母。
django-rest-framework 的 AngularJS 客户端,只需使用 angular-django-rest-resource。效果很好。
url = url.replace(/\\/,"/");
这使得 Chrome/Safari 的斜杠转义修复可以在 Firefox 上正常工作。
app.factory('Things', function($resource){
return $resource('/api/v1/thing\\/', {}, {
query: {method:'GET', params:{},isArray:true}});
});
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');
});
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteCond %{REQUEST_METHOD} GET
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
这种方法的缺点:
这是我的路线
导出默认[ { 路径:'归档', 重定向至:“归档/”,
pathMatch: 'full',
},
{
path: 'filing/:id',
component: FilingComponent,
},
] 作为路线;