通用型WCF 标准JSON格式接口开发模版
发现很多程序员对通用型接口开发还不太了解,或者说开发的接口都有一定的固定性只能针对单方面业务或很难再次适配其他业务。现把我工作上开发的一个接口简化做成一个模版以供大家参考!这里使用到的Newtonsoft、log4net网上有很多介绍大家如果不懂可在网上查询并了解。
首先我们得在Web.config添加连接数据库字符串:
其次我们得建一个通用便捷类用于操作数据库与一些通用方法:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Web;
using Newtonsoft.Json.Linq;
using Oracle.ManagedDataAccess.Client;//需自行引入Oracle.ManagedDataAccessDLL入项目
using Oracle.ManagedDataAccess.Types;//需自行引入Oracle.ManagedDataAccessDLL入项目
namespace LX
{
public class wu
{
private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);//log4net日志需自行网上下载并引入项目
#region//连接串返回函数
///
///返回系统SQL连接串
///
public static string get_ZhFyWs()
{
string conn = "";
conn = System.Configuration.ConfigurationManager.ConnectionStrings["ZhFyWs"].ConnectionString.ToString();//3.5与4.0使用此句进行读取
return conn;
}
///
///返回产前系统SQL连接串
///
public static string get_CQ()
{
string conn = "";
conn = System.Configuration.ConfigurationManager.ConnectionStrings["CQ"].ConnectionString.ToString();//3.5与4.0使用此句进行读取
return conn;
}
#endregion
#region//读取数据操作
///
///参数:SQLStr SQL查询语句
///
/// 获取数据(首单条数据)
public static string[] get_ValueCQ(string SQLStr)
{
string conn = get_CQ();
OracleConnection con = new OracleConnection(conn);
try
{
con.Open();
}
catch (Exception error)
{
log.Error("连接数据库失败", error);
}
string select = SQLStr;
OracleCommand com = new OracleCommand(select, con);
OracleDataReader dir = com.ExecuteReader();
string[] strField = new string[dir.FieldCount];//动态定义数组长度
if (dir.Read())
{
for (int i = 0; i < dir.FieldCount; i++)//dir.FieldCount为当前行中的列数
{
strField[i] = Convert.ToString(dir["" + dir.GetName(i) + ""]);//dir.GetName(i)为列的字段名称
}
}
else
{
log.Info("未读取到信息");
}
dir.Close();
con.Close();
return strField;
}
///
///参数:SQLStr SQL查询语句
///
/// 获取数据(列表数据数据)
public static DataTable get_TableCQ(string SQLStr)
{
string conn = get_CQ();
OracleConnection con = new OracleConnection(conn);
try
{
con.Open();
}
catch (Exception error)
{
log.Error("连接数据库失败", error);
}
string select = SQLStr;
OracleDataAdapter da = new OracleDataAdapter(select, con);
DataSet ds = new DataSet();
try
{
da.Fill(ds);
}
catch (Exception error)
{
log.Error("数据库操作错误", error);
}
DataTable dt=ds.Tables[0];
con.Close();
return dt;
}
#endregion
#region//判断是否存在数据
///
/// 说明:SelectSQL用来执行SQL语句。
/// 返回值:操作是否成功(true\false)。
/// 参数:sQueryString SQL字符串
///
/// 数据查询系统数据是否存在
public static Boolean SelectCQ(string sQueryString)
{
Boolean k;
string conn = get_CQ();
OracleConnection con = new OracleConnection(conn);
try
{
con.Open();
}
catch (Exception error)
{
log.Error("连接数据库失败", error);
}
OracleCommand com = new OracleCommand(sQueryString, con);
OracleDataReader dir = com.ExecuteReader();
if (dir.Read())
{
k = true;
}
else
{
k = false;
}
con.Close();
return k;
}
#endregion
#region//判断是否存在调用接口权限
///
/// 说明:SelectSQL用来执行SQL语句。
/// 返回值:操作是否成功(true\false)。
/// 参数:key 验证密钥,xtmc 系统名称,jkmc 接口名称
///
/// 数据查询、登陆判断方法
public static Boolean SelectZhFyWs(string key,string xtmc,string jkmc)
{
Boolean k;
string sQueryStringstr = "";
DateTime Dtime = DateTime.Now;
sQueryStringstr =“这里用你的权限判断表进行权限判断是否有权限(根据自身情况写sql语句)”;
if (SelectZhFy(sQueryStringstr) == true)
{
k = true;
log.Info("可系统级别调用" + xtmc);
}
else
{
sQueryStringstr =“这里用你的权限判断表进行权限判断是否有权限(根据自身情况写sql语句)”;
if (SelectZhFy(sQueryStringstr) == true)
{
k = true;
log.Info("可单接口级别调用" + jkmc);
}
else
{
k = false;
log.Info("无系统与接口调用权限");
}
}
return k;
}
#endregion
#region//常用转换函数
///
/// 说明:拼接函数
/// 返回值:操作是否成功(true\false)。
/// 参数:SQL 拼接的sql语句,istr 计数器,Code 拼接字段代码,Value 拼接的字段值,
///
/// 常用拼接函数
public static Boolean PJ(ref string SQL, ref int istr, in string Code, in string Value)
{
Boolean k;
k = false;
if (Value != "" && Value != null)
{
istr++;//有效参数计数加1
SQL += " and " + Code + "='" + Value + "'";
k = true;
}
else
{
k = false;
}
return k;
}
///
/// 说明:拼接函数
/// 返回值:操作是否成功(true\false)。
/// 参数:SQL 拼接的sql语句,istr 计数器,Code 拼接字段代码,Value1 拼接的字段值(时间开始),Value1 拼接的字段值(时间结束)
///
/// 常用拼接函数
public static Boolean PJ(ref string SQL, ref int istr, in string Code, in DateTime Value1, in DateTime Value2)
{
Boolean k;
k = false;
if (Value1 != null && Value2 != null)
{
istr++;//有效参数计数加1
SQL += " and " + Code + ">=to_date('" + Value1 + "', 'yyyy-mm-dd hh24:mi:ss') and " + Code + "
k = true;
}
else
{
k = false;
}
return k;
}
///
/// 说明:拼接函数(in 值拼接)
/// 返回值:操作是否成功(true\false)。
/// 参数:SQL 拼接的sql语句,Value 拼接的字段值, ValueStr 拼接的内容值
///
/// 常用拼接函数
public static Boolean PJIN(ref string Value,in string ValueStr)
{
Boolean k;
k = false;
/*string instr = "''"*/;
if (ValueStr != "" && ValueStr != null)
{
if (Value == "" || Value == null)
{
Value += "'" + ValueStr + "'";
}
else
{
Value += ",'" + ValueStr + "'";
}
// Value = instr;
k = true;
}
else
{
k = false;
}
return k;
}
///
/// 说明:拼接函数
/// 返回值:操作是否成功(true\false)。
/// 参数:SQL 拼接的sql语句,istr 计数器,Code 拼接字段代码,Value 拼接的字段值,
///
/// 常用拼接函数
public static Boolean PJColleagues(ref string SQL, ref int istr, in string Code, in string Value)
{
Boolean k;
k = false;
if (Value != "" && Value != null)
{
istr++;//有效参数计数加1
SQL += " and " + Code + " in (" + Value + ")";
k = true;
}
else
{
k = false;
}
return k;
}
///
/// 说明:拼接函数
/// 返回值:操作是否成功(true\false)。
/// 参数:SQL 拼接的sql语句,istr 计数器,Code 拼接字段代码,Value1 拼接的字段值(时间开始),Value1 拼接的字段值(时间结束)
///
/// 常用拼接函数
public static Boolean PJSQL(ref string SQL, ref int istr, in string Code, in DateTime Value1, in DateTime Value2)
{
Boolean k;
k = false;
if (Value1 != null && Value2 != null)
{
istr++;//有效参数计数加1
SQL += " and " + Code + ">'" + Value1 + "' and " + Code + "<'" + Value2.AddDays(1) + "'";
k = true;
}
else
{
k = false;
}
return k;
}
///
/// 说明:Null转符串函数
/// 返回值:字符串。
/// 参数:SQL 拼接的sql语句,istr 计数器,Code 拼接字段代码,Value 拼接的字段值,
///
/// 常用拼接函数
public static string SetNull(JToken joStr)
{
string str = "";
if (joStr != null)
{
str = joStr.ToString();
}
else
{
str = "";
}
return str;
}
#endregion
}
}
之后我们还得建一个通用JSON工厂类:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
namespace LX
{
[JsonObject(MemberSerialization.OptOut)]
public class JsonProduct
{
public int State { get; set; } //状态
public string Msg { get; set; } //状态描述
public DataTable Data { get; set; } //明细数据
}
}
最后我们还可以愉快的创建自已的通用型接口了:
using Newtonsoft.Json;//需自行引入Newtonsoft.Json入项目
using Newtonsoft.Json.Linq;//需自行引入Newtonsoft.Json入项目
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace LX
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“CQ”。
// 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 CQ.svc 或 CQ.svc.cs,然后开始调试。
public class CQ : ICQ
{
string xtmcstr = "XXX系统";
private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
///
///获取产前羊水穿刺数据(列表数据数据)
///
public string CQYSCC(string JSonValue)
{
//测试数据
//{"KEY" : "KOGFSPKBCSD","BC_SAM_NAME" : "项目名称","BC_NAME" :"用户名","BATCH_ID" :"","BC_D_NAME" :"部门名称","BC_IN_NO" :"999999","BC_SEX" :"女 ","BC_AGE" :"36Y","SEND_DOCT" :"操作员名称","SEND_TIMEKS" :"2019-03-10","SEND_TIMEJS" :"2019-03-15","TEL" :"00000000","REPORT_DATEKS" :"2019-03-17","REPORT_DATEJS" :"2019-04-08"}
string jkmcstr = "接口名称";//接口中文名称
string keyStr = "";//验证Key
JsonProduct jp = new JsonProduct();//Json 生产对像
jp.State = 0;//0无数据,1成功,2错误
jp.Msg = "无数据";
int iCount = 2;//必需通过数
int i = 0;//参数通过计数器
string BC_BAR_CODE = "";//
string BATCH_ID = "";//
string BC_D_NAME = "";//
string BC_SAM_NAME = "";//
string BC_NAME = "";//
string BC_IN_NO = "";//
string BC_SEX = "";//
string BC_AGE = "";//
string CH_LAB_NO = "";//
string SEND_DOCT = "";//
string ITR_NAME = "";//
string SEND_TIMEKS = "";//
string SEND_TIMEJS = "";//
//string BC_DIAG = "";//
string TEL = "";//
//string METHOD = "";//
string REPORT_DATEKS = "";//
string REPORT_DATEJS = "";//
log.Info("入参:"+ JSonValue);
//将json转换为JObject
JObject jo = JObject.Parse(JSonValue);
keyStr =wu.SetNull(jo["KEY"]);
BC_BAR_CODE =wu.SetNull(jo["BC_BAR_CODE"]);
BATCH_ID =wu.SetNull(jo["BATCH_ID"]);
BC_D_NAME =wu.SetNull(jo["BC_D_NAME"]);
BC_SAM_NAME =wu.SetNull(jo["BC_SAM_NAME"]);
BC_NAME =wu.SetNull(jo["BC_NAME"]);
BC_IN_NO =wu.SetNull(jo["BC_IN_NO"]);
BC_SEX =wu.SetNull(jo["BC_SEX"]);
BC_AGE =wu.SetNull(jo["BC_AGE"]);
CH_LAB_NO =wu.SetNull(jo["CH_LAB_NO"]);
SEND_DOCT =wu.SetNull(jo["SEND_DOCT"]);
ITR_NAME =wu.SetNull(jo["ITR_NAME"]);
SEND_TIMEKS =wu.SetNull(jo["SEND_TIMEKS"]);
SEND_TIMEJS =wu.SetNull(jo["SEND_TIMEJS"]);
TEL =wu.SetNull(jo["TEL"]);
REPORT_DATEKS =wu.SetNull(jo["REPORT_DATEKS"]);
REPORT_DATEJS =wu.SetNull(jo["REPORT_DATEJS"]);
string jsonstr = "";
string selectStr = "这里写你业务SQL语句";//
wu.PJ(ref selectStr,ref i, "E.BC_BAR_CODE", BC_BAR_CODE);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.BATCH_ID", BATCH_ID);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.BC_D_NAME", BC_D_NAME);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.BC_SAM_NAME", BC_SAM_NAME);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.BC_NAME", BC_NAME); //组合查询条件
wu.PJ(ref selectStr, ref i, "E.BC_IN_NO", BC_IN_NO);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.BC_SEX", BC_SEX);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.BC_AGE", BC_AGE);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.CH_LAB_NO", CH_LAB_NO); //组合查询条件
wu.PJ(ref selectStr, ref i, "E.BC_D_NAME", BC_D_NAME);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.SEND_DOCT", SEND_DOCT);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.ITR_NAME", ITR_NAME);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.BC_IN_NO", BC_IN_NO);//组合查询条件
wu.PJ(ref selectStr, ref i, "E.TEL", TEL);//组合查询条件
try
{
if (REPORT_DATEKS != "" && REPORT_DATEJS != "")
{
wu.PJ(ref selectStr, ref i, "T.REPORT_DATE", Convert.ToDateTime(REPORT_DATEKS), Convert.ToDateTime(REPORT_DATEJS));//组合查询条件
}
if (SEND_TIMEKS != "" && SEND_TIMEJS != "")
{
wu.PJ(ref selectStr, ref i, "E.SEND_TIME", Convert.ToDateTime(SEND_TIMEKS), Convert.ToDateTime(SEND_TIMEJS));//组合查询条件
}
}
catch (Exception error)
{
log.Error("时间格式转换错误"+error);
jp.State = 2;
jp.Msg = "时间格式转换错误";
}
if (i >= iCount)
{
if (wu.SelectZhFyWs(keyStr, xtmcstr, jkmcstr) == true)
{
string select = selectStr;
DataTable dt = wu.get_TableCQ(select);
jp.Data = dt;
if (dt.Rows.Count > 0)
{
jp.State = 1;
jp.Msg = "成功";
}
else
{
jp.State = 0;
jp.Msg = "无数据,请核实查询条件是否能返回数据";
}
jsonstr = JsonConvert.SerializeObject(jp);//序列化
log.Info("查询" + jp.Msg);
}
else
{
jp.State = 2;
jp.Msg = "无接口调用权限";
jsonstr = JsonConvert.SerializeObject(jp);//序列化
}
}
else
{
jp.State = 2;
jp.Msg = "传入有效参数数量不足,至少需"+Convert.ToString(iCount)+"个";
log.Info("传入有效参数数量不足,至少需" + Convert.ToString(iCount) + "个");
jsonstr = JsonConvert.SerializeObject(jp);//序列化
}
return jsonstr;
}
}
}
只需以上简单几步,相信大家熟悉了这个模板后很容易就能定制出自已的通用接口模版。