1

SAP의 서비스 계층에 연결하고 url (API REST)에서 쿼리를 작성하는 앱을 만들고 있습니다. famouse 위젯 select2를 사용하고 있지만 문제가 있습니다. 나는 API에 대한 쿼리를 만들 필요가, 그 문장 ("") 공백 문자가 있습니다Select2 위젯은 ajax에 param.term 공백을 "%"가 아닌 "+"로 보냅니다.

"(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 rest service가 잘못된 문자이며 내 결과를 얻을 수 없다고 말합니다. 여러분 모두가 볼 수 있듯이

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

의 주위에 공간 "또는"연산자는 더하기 기호로 대체되고있다 :

이것은 보이는 방법이다. 나는 자바 스크립트 함수 "encodeUri()"및 "encodeURIComponent()"을 테스트했으며 코드에서 직렬화되고 있다고 생각하기 때문에 아무 것도하지 않습니다. 나는 contentType을 추가했다. 공간을 수동으로 "% 20"으로 바꿨지 만 그 결과는 인코딩되고 악화되었다. (% 2520) ...

아무도 도와 줄 수 없다. 공백이 "% 20"으로 변경되고 지긋 지긋한 "+"이 인코딩 유형을 변경하는 방법이 있습니까 ??

감사합니다.

+0

GET 요청을 보내면 url 매개 변수에 쿼리를 추가 할 수 있지만 검색 창에 입력되는 용어를 가져와야한다는 것을 기억합니다. 그 수준에서 그것을 얻는 방법을 신경 쓰지 마라. .. –

답변

0

나는 스스로 대답합니다.

설명서에 대해 읽었을 때 중요한 단서를 발견했습니다. javascript 함수에서 ajax "url"속성을 매개 변수로 검색 할 수 있습니다. 그래서 쿼리 문자열에 합류 URL을 구축하고 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는 행복하고 그 결과를 침이다. Hugs from Venezuela ;-)