资源的斜尾斜杠

问题描述 投票:0回答:10

我的 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/

angularjs
10个回答
65
投票

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

您现在可以这样配置:

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

35
投票

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

如上述问题所述,

$resource
工厂非常适合符合特定规范的 RESTful 端点。虽然
$resource
可以很好地与符合此规范的后端进行通信,但它也有局限性,可能会排除不遵守
$resource
所期望的合同的后端。在这种情况下,最好的方法是切换到使用较低级别的
$http
服务,如本问题所述:从服务器获取数据的推荐方法

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


20
投票

在 url 模板的最后添加一个空格可以在这里工作(使用 Angular 1.2.0 进行测试):

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

6
投票

添加 2 个反斜杠以转义 URL 上的尾部斜杠,这对我在 Chrome 和 Safari 上有效。

然而,Firefox 认为从 URL 中删除尾部斜杠并将转义正斜杠的反斜杠编码为 %5C...太棒了 :-) 所以在上面的示例中,您会得到

http:/ /example.com/controller/save%5C,然后在服务器上进行 404 处理。

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


2
投票
对于使用

django-rest-framework 的 AngularJS 客户端,只需使用 angular-django-rest-resource。效果很好。


1
投票
我可以通过在编写最终 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}}); });
    

1
投票
可以对所有或特定的 url 使用 http 拦截器,例如API 网址:

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

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

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

这种方法的缺点:

    RESTful 调用的网络流量进行 301 重定向,因此您会看到请求发送了两次
  • 这仅适用于 GET 请求(请注意我的示例中的限制),如果重写接收到 POST、DELETE、PUT 请求和重定向,则会将其视为同一 URL 的 GET 请求,当然这可能不是您想要的,因为你失去了有效负载。

0
投票
http://localhost:4200/detail/filing/?您遇到这个问题吗?他们在角度 18 的斜线后添加问号|

这是我的路线

导出默认[ { 路径:'归档', 重定向至:“归档/”,

pathMatch: 'full', }, { path: 'filing/:id', component: FilingComponent, },
] 作为路线;


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

© www.soinside.com 2019 - 2024. All rights reserved.