Angularjs 资源的角拖尾斜杠
我的api需要api调用的尾部斜杠。我想知道如何用angular完成这个 因此,我需要能够访问Angularjs 资源的角拖尾斜杠,angularjs,Angularjs,我的api需要api调用的尾部斜杠。我想知道如何用angular完成这个 因此,我需要能够访问/tasks/或/tasks/xxxx/我试图通过以下方式进行访问: angular.module('taskServices', ['ngResource']). factory('Tasks', function($resource){ return $resource('/tasks/:task_id/', {}, { qu
/tasks/
或/tasks/xxxx/
我试图通过以下方式进行访问:
angular.module('taskServices', ['ngResource']).
factory('Tasks', function($resource){
return $resource('/tasks/:task_id/', {}, {
query: {method:'GET',
params:{},
isArray:true}
});
});
和
但是它会导致一个/tasks
或tasks/xxx
查询
如何强制它始终为
/tasks/
和/tasks/xxx/
在AngularJS源代码中,尾部斜杠被显式删除。我不完全确定该代码背后的原理,但已经有一个问题:
正如前面提到的问题中提到的,$resource
工厂对于符合特定规范的RESTful端点非常有用。虽然$resource
可以很好地与符合本规范要求的后端进行对话,但它有一些限制,可能会排除不遵守$resource
所期望的契约的后端。在这种情况下,最好的方法是切换到使用较低级别的$http
服务,如本问题所述:
$http
是一项功能强大且灵活的服务,允许对URL、发送的参数等进行完全控制。Vincent对尾随斜杠的转义(添加两个反斜杠和一个正斜杠(http://example.com/controller/save\\/)到URL的末尾)对我有用。在Chrome和Safari上添加2个反斜杠以避开URL上的尾随斜杠对我有用
然而,Firefox认为从URL中删除尾随斜杠并将正斜杠转义为%5C的反斜杠编码是一个好主意…太好了:-)因此在上面的示例中,您会得到,然后在服务器上得到404s
我在我的项目中使用Django+TastyPie,需要URL上的尾随斜杠,我希望修改ngResource,而不是将所有内容的最低公分母降到$http。作为解决方法,直到/如果他们更改AngularJS源代码,我设置了一个.htaccess重写规则,以向Web服务器的所有传入请求添加一个尾随斜杠
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteCond %{REQUEST_METHOD} GET
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
这种方法的缺点:
- RESTful调用的网络流量会被301重定向,因此您会看到请求被发送两次
- 这仅适用于GET请求(请注意我的示例中的限制),如果重写接收POST、DELETE、PUT请求和重定向,它将作为相同URL的GET请求来执行,当然这可能不是您想要的,因为您丢失了负载
url = url.replace(/\\/,"/");
这使得Chrome/Safari的斜杠转义修复程序在Firefox上运行良好
app.factory('Things', function($resource){
return $resource('/api/v1/thing\\/', {}, {
query: {method:'GET', params:{},isArray:true}});
});
在url模板的最末端添加一个空格在这里起作用(使用angular 1.2.0进行测试):
对于使用的AngularJS客户端,只需使用。非常好。可以对所有或特定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');
});
这似乎已经得到了解决: 现在可以通过以下方式对其进行配置:
app.config(function($resourceProvider) {
$resourceProvider.defaults.stripTrailingSlashes = false;
});
这可能是一个错误,我不明白为什么angular会强制删除尾部斜杠。你也可以在url的末尾添加一个#,但可能会有一些未知的后果。@Breedly我只是切换。。。感谢您帮助我保持最新。转义尾部斜杠('foo/:id\\\/')对我来说很有效(v1.1.3)@vincent听起来如果他们修复Angular中的错误可能会中断,但firefox会将转义斜杠转换为%5C。。。这里真烦人,小心点。如果这将用于在查询字符串中包含一些参数的GET,它将失败!您的问题有什么解决方案吗?非常感谢您的提醒。将错误获取为TypeError:无法设置UndefinedName的属性'stripTrailingSlashes',注意,您不必将此添加到应用程序中,也可以将其添加到资源模块中:
angular.module('myresources',['ngResource']).config(函数($resourceProvider){$resourceProvider.defaults.stripTrailingSlashes=false;})
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');
});
app.config(function($resourceProvider) {
$resourceProvider.defaults.stripTrailingSlashes = false;
});