Подтвердить что ты не робот

Angular конечный слэш для ресурса

Мой 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/

4b9b3361

Ответ 1

Это, кажется, исправлено: https://github.com/angular/angular.js/pull/5560

Теперь вы можете настроить его следующим образом:

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

Ответ 2

Конечная косая черта явно удаляется в этой строке исходного кода AngularJS. Я не совсем уверен, что послужило основанием для этого кода, но для этого уже существует проблема: https://github.com/angular/angular.js/issues/992

Как отмечено в упомянутой проблеме, $resource factory отлично подходит для конечных точек RESTful, которые соответствуют определенной спецификации. В то время как $resource сделает отличную работу с back-end, соответствующей этой спецификации, она имеет ограничения, которые могли бы исключить ее для back-end, которые не подчиняются контракту, ожидаемому $resource. В таком случае наилучшим способом перехода является использование службы нижнего уровня $http, как указано в этом вопросе: Рекомендуемый способ получения данных с сервера

$http - очень мощный и гибкий сервис и позволяет полностью контролировать URL-адреса, отправленные параметры и т.д.

Ответ 3

добавление пробела в самом конце шаблона url работает здесь (проверено с помощью angular 1.2.0):

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

Ответ 4

Добавление двух обратных косых черт для удаления конечной косой черты по URL-адресу, работающему для меня в Chrome и Safari.

Тем не менее, Firefox решает, что его хорошая идея удалить конечную косую черту из URL-адреса и закодировать обратную косую черту, которая ускользала от косой черты до% 5C... great:-) Итак, в приведенном выше примере вы получите http://example.com/controller/save%5C, который затем 404s на сервере.

Я использую Django + TastyPie для своего проекта и нуждаюсь в концевой косой черте по URL-адресу, я буду искать модификацию ngResource, а не падение до $http для всего, как самого низкого общего знаменателя.

Ответ 6

Можно использовать 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');
});

Ответ 7

Как работа для этого до или если они когда-либо меняют источник AngularJS, я устанавливаю правило перезаписи .htaccess для добавления конечной косой черты ко всем входящим запросам на веб-сервер.

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

Недостатки этого подхода:

  • Сетевой трафик вызовов RESTful получает 301 перенаправление, поэтому вы видите дважды отправленные запросы.
  • Это работает только для запросов GET (обратите внимание на ограничение в моем примере), если переписывание получает запросы POST, DELETE, PUT и перенаправления, оно делает это как запрос GET того же URL-адреса, который может быть не таким, каким вы хотите конечно, поскольку вы теряете свою полезную нагрузку.

Ответ 8

Я могу преодолеть проблему кодирования 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}});
        }); 

Ответ 9

Винсент ушел из трейлинг-косой черты (добавьте две обратные косые черты и косую черту (http://example.com/controller/save\\/) до конца URL-адреса) работал у меня.