RESTful架构中怎么使用post利用Json字符串的序列化实现微信消息推送

推荐大神级博客:

C#中Json字符的序列化和反序列化

如何给老婆解释什么是REStful

RESTful架构风格概述

看完上述博客,相信你已经对RESTful 和Json已经有了详细的认识,如果可以看完整篇博客之后,您可以再回顾一下上面的博客,一定会豁然开朗。整体流程图:

先来讲一下要实现的内容:

为了保证学生秩序上机练习,设计如下:

学生考试前练习的机房——打开手机微信公众号二维码扫码签到入场(前提学生已经绑定注册公众号)——

学生收到签到提示 和上机验证码——在电脑上输入验证码才能开始上机操作

简化版,设置一个小Demo

目的:点击如上按钮,该学生微信提示学生签到成功

using restful;//添加引用

private void btnPushCode_Click(object sender, EventArgs e)
        {
            
            //学生的信息实体
            StudentInfo studentInfo = new StudentInfo();

            // 赋值字段
            studentInfo.EventName = "4445"; //将验证码赋值
            studentInfo.UserCode = "15070141061";//学生学号
            studentInfo.UserId = "15070141061";  //根据templateId(模板ID)和UserId(此学生关注公众号产生的标识ID)推送给公众号消息;
            studentInfo.UserName = "xml";//学生姓名
           

            // 必传字段
            studentInfo.ClassName = "土木";
            studentInfo.ConfirmType = "100";//模板上一定要有的字段,但实际推送显示不需要用到,所以任何都行,目的是占位
            studentInfo.TemplateId = "OZuUS9TKmg5IXpY0fGPC3gI65ie72k3GEDn1zY_dxbE";  //绑定公众号后提示框类型;模板ID;
           
            //进行序列化
            string result = IRestful.RestfulAdd(new Serialize().Serialize1(studentInfo));
            
            MessageBox.Show("推送验证码完毕");
        }

这里的学生实体也需要进行序列化的封装,例如UserId是C#代码这边命名的,Java那边的代码想要使用这个实体,直接用 [DataMember(Name = "userId")]序列化后的userId 就可以

using System.Runtime.Serialization;  //序列化


namespace restful
{
    [DataContract]//必须申明,否则无法序列化
    public  class StudentInfo
    {
        [DataMember(Name = "userId")]//必须申明,否则无法序列化
        private string _userId;

        public string UserId
        {
            get { return _userId; }
            set { _userId = value; }
        }


        [DataMember(Name = "userName")]//必须申明,否则无法序列化
        private string _userName;

        public string UserName
        {
            get { return _userName; }
            set { _userName = value; }
        }
        [DataMember(Name = "templateId")]//必须申明,否则无法序列化
        private string _templateId;

        public string TemplateId
        {
            get { return _templateId; }
            set { _templateId = value; }
        }
        [DataMember(Name = "pushStartTime")]//必须申明,否则无法序列化
        private string _pushStartTime;

        public string PushStartTime
        {
            get { return _pushStartTime; }
            set { _pushStartTime = value; }
        }
        [DataMember(Name = "eventName")]//必须申明,否则无法序列化
        private string _eventName;

        public string EventName
        {
            get { return _eventName; }
            set { _eventName = value; }
        }
        [DataMember(Name = "pushEndTime")]//必须申明,否则无法序列化
        private string _pushEndTime;

        public string PushEndTime
        {
            get { return _pushEndTime; }
            set { _pushEndTime = value; }
        }
        [DataMember(Name = "userCode")]//必须申明,否则无法序列化
        private string _userCode;

        public string UserCode
        {
            get { return _userCode; }
            set { _userCode = value; }
        }
      
    }
}

重头戏:序列化是怎么操作的:

 #region 序列化
        /// <summary>
        /// 将数据转换成json
        /// </summary>
        /// <param name="person">学生信息</param>
        /// <returns>json</returns>
        public string Serialize1(StudentInfo studentInfo)
        {
            //序列化对象
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(StudentInfo));
            MemoryStream ms = new MemoryStream();//把数据转换成内存流
            //将对象转换成json存储
            ser.WriteObject(ms, studentInfo);

            string jsonStr = Encoding.UTF8.GetString(ms.ToArray());
            return jsonStr;
        }
        #endregion

 把序列化后的内容怎么传递到微信?通过url

那么什么是URL:再去看上面的连接:RESTful架构风格概述

这里涉及到了post 请求,可以看上面的连接:如何给老婆解释什么是REStful 解释的绝对到位

 public static string RestfulAdd(string jsonParam)
        {
            //调用无状态查找地址,也就是接口,用post把序列化的学生信息以jion的形式传递过去
            string url = "http://dmsdbj.com/message-web/messagePush/pushInstanceMsg"; //生产环境调用的url;
                                                                 
            string json = string.Empty;
            //创建restful的Post请求:
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "post";
            request.ContentType = "application/json";

            //创建参数
            string data = jsonParam;
            byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());
            request.ContentLength = byteData.Length;

            //以流的形式附加参数
            using (Stream postStream = request.GetRequestStream())
            {
                postStream.Write(byteData, 0, byteData.Length);
            }

            //接收来自restful的post的回复:{"code":"0000","message":"即时消息推送成功"}
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                //以流的形式读取,返回的就是字符串的json格式
                StreamReader reader = new StreamReader(response.GetResponseStream());
                json = reader.ReadToEnd();
            }
            return json;
        }

那么URL地址那边接收到序列化传过去的Json数据流,需要再反序列化转换成可使用的学生数据,通过根据templateId(模板ID)和UserId(此学生关注公众号产生的标识ID)推送给公众号消息到手机;

让我们来看一下Json 长什么样子:我们展现的就是1.对象的形式

它有三种表现形式:

1、对象:“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束

{"className":"土木","confirmType":"100",
"eventName":"4445",
"profession":null,"pushEndTime":null,"pushStartTime":null,"templateId":"OZuUS9TKmg5IXpY0fGPC3gI65ie72k3GEDn1zY_dxbE",
"userCode":"15070141061",
"userId":"15070141061",
"userName":"xml"}

2、数组:设置值的顺序,一个数组以中括号"["开始,并以中括号"]"结束

例如:

 var userlist = [

 {"user":{"name":"Manas","gender":"Male","birthday":"1987-8-8"}}, 
 {"user":{"name":"Mohapatra","Male":"Female","birthday":"1987-7-7"}}

                 ]

3、字符串:任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔

例如: var userlist = "{\"ID\":1,\"Name\":\"Manas\",\"Address\":\"India\"}" 

到这里我们已经应用到了RESTful的那几大特点:资源(JSON)、统一接口(POST)、URL无状态 RESTful架构风格的所有特点在这个Demo都可以体现。

不断完善更新中,欢迎交流!

 

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢美玲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值