我正在开发一个连接到SAP服务层的应用,并通过网址(API REST)进行查询。我正在使用famouse widget select2,但我遇到了问题。我需要对api进行查询,其句子有空格字符(""):
"(startswith(CardCode,'"+params.term+"') or startswith(CardName,'"+params.term+"'))
这些空间是"或"周围的空间。操作
所以这是mi代码:
$('#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 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正在对查询进行编码,以便用加号(+)替换空格而不是&#34;%20&#34;所以api休息服务说这是一个非法的角色,我无法得到我的结果。
这就是它的样子:
https://service.net:50000/b1s/v1/BusinessPartners?%24filter=(startswith(CardCode%2C%27CLIEN%27)+or+startswith(CardName%2C%27CLIEN%27))&%24orderby=cardName
正如大家所见,&#34;或&#34;周围的空间运算符正被加号替换。我测试了javascript函数&#34; encodeUri()&#34;和&#34; encodeURIComponent()&#34;它什么也没做,因为我认为它是在代码中被序列化的。我添加了contentType,我用&#34;%20&#34;手动替换了空格。但结果是编码而且更糟糕(%2520)......
任何人都可以帮助我。有没有办法改变这种类型的编码,所以空格变为&#34;%20&#34;而不是该死的&#34; +&#34; ??
谢谢大家!
答案 0 :(得分:0)
我自己回答。
我正在阅读有关文档的内容并找到了重要的线索:我可以获得ajax&#34; url&#34;来自javascript函数的属性获取被搜索的术语作为参数。所以我构建了连接查询字符串的url并使用了encodeURI javascript函数,它工作正常! :-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很高兴并吐出结果......
希望这有助于其他人。来自委内瑞拉的拥抱; - )