上一章我已经写完后台过滤器的所有方法,这一章,主要将客户端调用方法写明确了。也把我的过滤器代码公布出来,供大家参考。
1、客户端我就不写C#程序调用了,直接写jquery代码了,可以参考此代码自行编写C#代码或者其他语言代码,客户端也分为GET和POST方法进行调用,稍微有些许不同。
2、获取Token字符串。
//获取Token
function GetToken() {
var Url = url + "/TokenQM/Get_Token";
$.ajax({
url: Url,
type: "GET",
data: {
userId: "luyingjie"
},
dataType: 'json',
success: function (data) { //请求成功后返回
token = data.data.SignToken;
//Submit_Get_Server();//GET
Submit_Post_Server();//POST
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log(errorThrown.message);
}
})
}
获取结果
3、GET请求。
跟后台一样,需要确定参数,然后对参数进行序列化,首先要去除没有值的参数,然后对参数进行排序,最后对参数按照字母顺序进行排序
A参数状态
var data = {
ID: "cs123",
StartDate: "2020-01-27",
EndDate: "2020-09-27",
}
B筛查排序后参数状态
var data = {
EndDate: "2020-09-27",
ID: "cs123",
StartDate: "2020-01-27",
}
C字母排序后参数状态
"EndDate2020-09-27IDluyingjieStartDate2020-01-27"
参数匹配完毕后,就要将随机数,时间戳,UserId,Token值和参数进行序列化并加密处理了
//参数判断
function filterParams(obj) {
let _newPar = {};
for (let key in obj) {
//如果对象属性的值不为空,就保存该属性(如果属性的值为0,保存该属性。如果属性的值全部是空格,属于为空。)
if ((obj[key] === 0 || obj[key]) && obj[key].toString().replace(/(^\s*)|(\s*$)/g, '') !== '') {
//记录属性
_newPar[key] = obj[key];
}
}
_newPar=objKeySort(_newPar);
//返回对象
return _newPar;
}
//排序的函数
function objKeySort(obj) {
var newkey = Object.keys(obj).sort();
//先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
var newObj = {};//创建一个新的对象,用于存放排好序的键值对
for (var i = 0; i < newkey.length; i++) {//遍历newkey数组
newObj[newkey[i]] = obj[newkey[i]];//向新创建的对象中按照排好的顺序依次增加键值对
}
return newObj;//返回排好序的新对象
}
//签名
function GetSignature(userid, timestamp, nonce, data, token) {
if (!token) {
return null;
}
//拼接签名数据
var signStr = (timestamp + '') + (nonce + '') + userid + token + data;
//将字符串中字符按升序排序
var sortStr = Array.from(signStr).sort().join("");//升序
//console.log(Array.from(signStr).sort().reverse().join(""));//降序
//使用MD5加密
var md5Val = hex_md5(sortStr);
return md5Val
}
GET请求方法
function Submit_Get_Server() {
var Url = url + "/TokenQM/Get_GRInfo";
var data = {
ID: "cs123",
StartDate: "2020-01-27",
EndDate: "2020-09-27",
}
data = filterParams(data);//参数判断
//转换成字符串
for (let key in data) {
data_str += key + data[key];
}
//生成签名字段
var signature = GetSignature(userid, timestamp, nonce, data_str, token);
if (!signature) {
console.log("Token获取失败");
return;
}
$.ajax({
url: Url,
type: "GET",
data: data,
dataType: 'json',
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
beforeSend: function (request) {
request.setRequestHeader("userid", userid);
request.setRequestHeader("timestamp", timestamp);
request.setRequestHeader("nonce", nonce);
request.setRequestHeader("signature", signature);
},
success: function (data) { //请求成功后返回
console.log(data);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log(errorThrown.message);
}
})
}
返回结果
3、POST请求。
post请求大概率不会只上传一个参数,所以就必须将参数进行JSON序列化,上传。
var data = {
method: "SXZHFWAPI.BLLogic.WebMethod.ExecutePro",
params: JSON.stringify({
"pName": "WT_YWCL.GET_XHYY_BYGR",
"V_GRZH": "123456"
})
}
var data_str = JSON.stringify(data);
WebAPI在POST方法参数上必须加入FromBody。
[HttpPost]
public AuthenticationModel<JObject> Post([FromBody]string jsonData)
{
AuthenticationModel<JObject> Auth = new AuthenticationModel<JObject>();
JsonDataModel model = JsonConvert.DeserializeObject<JsonDataModel>(jsonData);
JObject jobj = JObject.FromObject(model);
Auth.Status = 1;
Auth.data = jobj;
return Auth;
}
当我们的WebAPI只有一个字符串参数的时候,我们前端上传也必须变一下(我也是试了好久)
$.ajax({
url: url,
type: "POST",
data: { "": data_str },
dataType: 'json',
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
beforeSend: function (request) {
request.setRequestHeader("userid", userid);
request.setRequestHeader("timestamp", timestamp);
request.setRequestHeader("nonce", nonce);
request.setRequestHeader("signature", signature);
},
success: function (data) { //请求成功后返回
console.log(data);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log(errorThrown.message);
}
})
}
上传参数一定要写成,才可以上传成功
data: { "": data_str },
当然你如果不将参数进行加密处理其实可以直接正式的Json方式上传,直接上传JSON对象,WebAPI更改为实体对象即可。
data : {
method: "SXZHFWAPI.BLLogic.WebMethod.ExecutePro",
params: JSON.stringify({
"pName": "WT_YWCL.GET_XHYY_BYGR",
"V_GRZH": "123456"
})
}
[HttpPost]
public AuthenticationModel<JObject> Post([FromBody]JsonDataModel model)
{
AuthenticationModel<JObject> Auth = new AuthenticationModel<JObject>();
JObject jobj = JObject.FromObject(model);
Auth.Status = 1;
Auth.data = jobj;
return Auth;
}
两个方式返回值都是相同的