Ответ 1
Это, кажется, исправлено: https://github.com/angular/angular.js/pull/5560
Теперь вы можете настроить его следующим образом:
app.config(function($resourceProvider) {
$resourceProvider.defaults.stripTrailingSlashes = false;
});
Мой 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();
Но это приводит к запросу /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
factory отлично подходит для конечных точек RESTful, которые соответствуют определенной спецификации. В то время как $resource
сделает отличную работу с back-end, соответствующей этой спецификации, она имеет ограничения, которые могли бы исключить ее для back-end, которые не подчиняются контракту, ожидаемому $resource
. В таком случае наилучшим способом перехода является использование службы нижнего уровня $http
, как указано в этом вопросе: Рекомендуемый способ получения данных с сервера
$http
- очень мощный и гибкий сервис и позволяет полностью контролировать URL-адреса, отправленные параметры и т.д.
добавление пробела в самом конце шаблона url работает здесь (проверено с помощью angular 1.2.0):
{url: '/user/:id/ '}
Добавление двух обратных косых черт для удаления конечной косой черты по URL-адресу, работающему для меня в Chrome и Safari.
Тем не менее, Firefox решает, что его хорошая идея удалить конечную косую черту из URL-адреса и закодировать обратную косую черту, которая ускользала от косой черты до% 5C... great:-) Итак, в приведенном выше примере вы получите http://example.com/controller/save%5C, который затем 404s на сервере.Я использую Django + TastyPie для своего проекта и нуждаюсь в концевой косой черте по URL-адресу, я буду искать модификацию ngResource, а не падение до $http для всего, как самого низкого общего знаменателя.
Для клиентов AngularJS, которые используют django-rest-framework, просто используйте angular-django-rest-resource. Отлично работает.
Можно использовать http-перехватчики для всех или определенных URL-адресов, например. api urls:
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 для добавления конечной косой черты ко всем входящим запросам на веб-сервер.
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteCond %{REQUEST_METHOD} GET
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
Недостатки этого подхода:
Я могу преодолеть проблему кодирования Firefox, добавив это в ngResource перед составлением окончательного URL:
url = url.replace(/\\/,"/");
Это позволяет исправить слэш для Chrome/Safari для работы в Firefox.
app.factory('Things', function($resource){
return $resource('/api/v1/thing\\/', {}, {
query: {method:'GET', params:{},isArray:true}});
});
Винсент ушел из трейлинг-косой черты (добавьте две обратные косые черты и косую черту (http://example.com/controller/save\\/) до конца URL-адреса) работал у меня.