推荐大神级博客:
看完上述博客,相信你已经对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都可以体现。
不断完善更新中,欢迎交流!