угловое кодирование пространства как + не% 20

Я использую angular 1.4.8, и у меня есть ошибка с параметром кодирования в запросе на получение.

Это мой сервис:

   angular
        .module('test')
        .factory('User',User);

    /* @ngInject */
    function User($resource) {
        return $resource('api/users/:login', {}, {
            'query': {method: 'GET', isArray: false},
            'get': {
                method: 'GET',
                transformResponse: function (data) {
                    data = angular.fromJson(data);
                    return data;
                }
            },
            'save': {method: 'POST'},
            'update': {method: 'PUT'},
            'delete': {method: 'DELETE'}
        });
    }

и это, когда я его использую:

     return User.get({
                        page: 1,
                        size: 20,
                        sort: 'email asc'  //THIS IS A PROBLEM
                    }
                    ).$promise.then(function (data, headersGetter) {

                       return data.content;
                    });

Мой запрос:

http://localhost:3000/api/users?page=0&size=10&sort=email+asc

Но это должно выглядеть так:

http://localhost:3000/api/users?page=0&size=10&sort=email%20asc

Почему angular неправильно кодирует этот параметр? Как исправить эту проблему?


person luckybastard    schedule 19.01.2016    source источник
comment
Параметры GET не предназначены для работы с пробелами. Я бы использовал два поля: sortField и sortType.   -  person Serginho    schedule 19.01.2016
comment
Попробуйте добавить transformRequest: [] к определению get. Это должно гарантировать отсутствие нежелательных преобразований запроса.   -  person jim0thy    schedule 19.01.2016
comment
вы не можете просто декодировать параметр на сервере?   -  person charlietfl    schedule 19.01.2016
comment
Я не управляю сервером, поэтому я не могу изменить реализацию   -  person luckybastard    schedule 19.01.2016
comment
@ jim0thy я добавляю, как вы сказали: 'get': { method: 'GET', transformRequest: [], transformResponse: function (data) { data = angular.fromJson(data); return data; } }, он все еще не работает, у меня есть знак +   -  person luckybastard    schedule 19.01.2016


Ответы (1)


Вы можете вручную закодировать, если это необходимо. Попробуй это:

sort: encodeURIComponent('email asc')

Или еще лучше, заверните всю готовую строку URL в encodeURIComponent.

Обратите внимание, что пробелы в параметрах URL недопустимы. Кодировка добавит %2520 на место пробела.

См. этот вопрос, задающий/объясняющий причину %2520 вместо %20

См. этот другой вопрос и ответ, цитирующий RFC.

person Daniel Nalbach    schedule 19.01.2016
comment
Почему вы говорите, что он не кодирует по умолчанию? Это делает внутренне - person charlietfl; 19.01.2016
comment
Когда я делаю это, как вы говорите, я получаю: http://localhost:3000/api/users?page=0&size=10&sort=email%2520asc - person luckybastard; 19.01.2016
comment
@charlietfl, можно подробнее? Я не вижу никакого кодирования в моем приложении, если я не укажу его вручную. - person Daniel Nalbach; 19.01.2016
comment
Параметры GET кодируются при сериализации. Посмотрите в источнике angular https://github.com/angular/angular.js/blob/master/src/ng/http.js#L26 - person charlietfl; 19.01.2016
comment
@charlietfl - вы определенно правы, и все же в моем приложении я не вижу кодировки многих символов. Не уверен, почему. Я изменю свой ответ. - person Daniel Nalbach; 19.01.2016