C# WEBAPI Token+数字签名(下)

上一章我已经写完后台过滤器的所有方法,这一章,主要将客户端调用方法写明确了。也把我的过滤器代码公布出来,供大家参考。
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;
    }

两个方式返回值都是相同的
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值