问题1:在js调用api时,传的参数中包含特殊字符,例如:%,&,#等
具体实例如下(个例情况具体处理,其他处理类似,懒得提取公共方法):
function Field_opportunity() {
var new_value = "";
var name = Xrm.Page.getAttribute("new_name").getValue();
var num = 0;
var clientURL = Xrm.Page.context.getClientUrl();
var req = new XMLHttpRequest();
if (name.includes("&")) {
name = name.replace("&", "%26");
num = 1;
}
var url = encodeURI(clientURL + "/api/data/v9.0/new_opportunityfieldses?$select=new_name&$filter=new_name eq '" + name + "'")
if (num = 1) {
url = url.replace("%2526", "%26");
}
req.open("GET", url, false);//'
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function () {
if (this.readyState == 4) {
req.onreadystatechange = null;
if (this.status == 200) {
var rdata = JSON.parse(this.responseText);
new_value = rdata.value[0].new_name;
if (new_value != "") {
alert("该名称已存在,请修改");
Xrm.Page.getAttribute("new_name").setValue("");
}
}
else {
var error = JSON.parse(this.responseText).error;
Xrm.Utility.alertDialog("查询实体记录出错." + error.message);
result = false;
}
}
};
req.send();
}
当上面参数name中包含'&'符号时,需要在encodeURI(clientURL + "/api/data/v9.0/new_opportunityfieldses?$select=new_name&$filter=new_name eq '" + name + "'"),处理数据前,先将参数name中的‘&’符号替换掉(参照url中特殊字符处理办法),然后在使用encodeURI方法,处理完的数据再次检查,替换掉包含的特殊字符,就可以正常调用api查询数据。
当然,在数据查询的过程中,尽量避免使用name座位查询条件,一般都采用唯一值的guid值作为查询条件,就要可以不用考虑数据处理问题,但是有一点需要注意:
实例如下:
//执行项目经理查找列表
function ManagerFilter() {
var ManagerFilter;
var deliveryDeptid=null;
var deliveryDeptValue = Xrm.Page.getAttribute("new_deliverydept").getValue();
if (deliveryDeptValue != null) {
deliveryDeptid = deliveryDeptValue[0].id.replace(/\{/, '').replace(/\}/, '');
}
var new_externalid = '';
var clientURL = Xrm.Page.context.getClientUrl();
var req = new XMLHttpRequest();
var url = encodeURI(clientURL + "/api/data/v9.0/businessunits?$select=new_externalid&$filter=businessunitid eq " + deliveryDeptid)
req.open("GET", url, false);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function () {
if (this.readyState == 4) {
req.onreadystatechange = null;
if (this.status == 200) {
var rdata = JSON.parse(this.responseText);
new_externalid = rdata.value[0].new_externalid;
ManagerFilter = "<filter type='and'>" +
"<condition attribute='new_bussinessid' operator='eq' value='" + new_externalid + "' />" +
"</filter>";
Xrm.Page.getControl("new_executiveprojectmanager").addCustomFilter(ManagerFilter, 'new_crm_user'); //对lookup字段值进行过滤处理
}
else {
var error = JSON.parse(this.responseText).error;
Xrm.Utility.alertDialog("查询实体记录出错." + error.message);
result = false;
}
}
};
req.send();
}
上面实例中的方法:var url = encodeURI(clientURL + "/api/data/v9.0/businessunits?$select=new_externalid&$filter=businessunitid eq " + deliveryDeptid),大家经常会习惯于写成
var url = encodeURI(clientURL + "/api/data/v9.0/businessunits?$select=new_externalid&$filter=businessunitid eq +‘"deliveryDeptid"' "),这样在调用api去send处理数据时,就会报错显示
"string无法转化为guid"的错误。