Виджет Select2 отправляет в ajax пробелы param.term как "+", а не как%20

Я работаю над приложением, которое подключается к сервисному слою SAP и выполняет запросы из URL (API REST). Я использую знаменитый виджет select2, но у меня проблема. Мне нужно сделать запрос к API, и его предложение имеет пробел (" "):

"(startswith(CardCode,'"+params.term+"') or startswith(CardName,'"+params.term+"'))

Пробелы - это те, которые находятся вокруг оператора "или".

Так что это ми код:

$('#buscarCliente').select2({
        placeholder: "Ingrese código o descripción del cliente",
        allowClear: true,
        language: "es",

        ajax: {
            url: SLServer+"BusinessPartners",
            crossDomain: true,
            xhrFields: {
                        withCredentials: true
            },
            dataType: 'json',
            type: 'GET',
            delay: 550,
            params: {
                contentType: 'application/raw; charset=utf-8'
            },
            data: function (params) {
              return {

                $filter: "(startswith(CardCode,'"+params.term+"') or startswith(CardName,'"+params.term+"'))", // Como se va hacer la busqueda
                $orderby : "cardName",
                //contentType: 'multipart/form-data;boundary=<Boundary>',

                //$filter: "((startswith(CardName,'" + params.term.toUpperCase() + "') or startswith(CardCode,'" + params.term.toUpperCase() + "') or startswith(CardName,'" + params.term + "') or startswith(CardCode,'" + params.term + "')) and CardType eq 'C')&$top=15&$expand=PaymentTermsType",
                //$filter: "startswith(CardName,'" + params.term.toUpperCase() + "') or startswith(CardCode,'" + params.term.toUpperCase() + "')",
                page: params.page
              };
            },

            processResults: function (data, params) {
            // parse the results into the format expected by Select2
            // since we are using custom formatting functions we do not need to
            // alter the remote JSON data, except to indicate that infinite
            // scrolling can be used
            params.page = params.page || 1;



            return {
              results: $.map(data.value, function(item) {
                    return { id: item.CardCode, text: "<b>"+item.CardCode+"</b> "+item.CardName }; //adecuamos el arreglo al select
                }),
              pagination: {
                    more: (params.page * 30) < data.total_count
              }
            };
          },
          cache: true
        },
        escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
        /*formatNoMatches: function (term) {
            return 'No se encontraron clientes con el código: "' + term + '".<br/><!--span class="link">Click&nbsp;here</span-->',
        },*/
        minimumInputLength: 1,
        //templateResult: formatRepo, // omitted for brevity, see the source of this page
        //templateSelection: formatRepoSelection // omitted for brevity, see the source of this page
      });

Как видите, я отправляю запрос как параметр, объединяющий термин, который вводится в виджете. Проблема в том, что select2 кодирует запрос таким образом, что заменяет пробелы символом плюса (+), а не "%20", поэтому служба отдыха API говорит, что это недопустимый символ, и я не могу получить свой результат.

Вот как это выглядит:

https://service.net:50000/b1s/v1/BusinessPartners?%24filter=(startswith(CardCode%2C%27CLIEN%27)+or+startswith(CardName%2C%27CLIEN%27))&%24orderby=cardName

Как вы все видите, пробелы вокруг оператора "или" заменяются символами "плюс". Я протестировал функцию javascript "encodeUri()" и "encodeURIComponent()", и она ничего не делает, потому что я думаю, что она сериализуется в коде. Я добавил contentType, я заменил пробелы вручную на "%20", но результат кодируется, и он хуже (%2520)...

Может кто-нибудь мне помочь. Есть ли способ изменить этот тип кодировки, чтобы пробелы изменились на "%20", а не чертовски "+"??

Спасибо вам всем!

1 ответ

Я отвечаю сам.

Я читал о документации и нашел и важную подсказку: я могу получить свойство ajax "url" из функции javascript, получая в качестве параметра искомый термин. Поэтому я создал URL, соединяющий строку запроса, и использовал функцию javascript encodeURI, и это сработало!:-D

ajax: {
            ....

            url: function (params) {
                return SLServer+"BusinessPartners"+encodeURI("?$top=15&$filter=((startswith(CardName,'" + params.term.toUpperCase() + "') or startswith(CardCode,'" + params.term.toUpperCase() + "') or startswith(CardName,'" + params.term + "') or startswith(CardCode,'" + params.term + "')) and CardType eq 'C')&$expand=PaymentTermsType";);
            },

            ....

Таким образом, пробелы переводятся в этой функции как%20, и API счастлив и плюет на результаты...

Надеюсь, это поможет кому-то еще. Объятия из Венесуэлы;-)

Другие вопросы по тегам