Angularjs 资源的角拖尾斜杠

Angularjs 资源的角拖尾斜杠,angularjs,Angularjs,我的api需要api调用的尾部斜杠。我想知道如何用angular完成这个 因此,我需要能够访问/tasks/或/tasks/xxxx/我试图通过以下方式进行访问: angular.module('taskServices', ['ngResource']). factory('Tasks', function($resource){ return $resource('/tasks/:task_id/', {}, { qu

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

但是它会导致一个
/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之前,我可以通过将其添加到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模板的最末端添加一个空格在这里起作用(使用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;
});