二开案例.WebApi.访问数据库
【应用场景】
开发自定义WebApi接口,访问数据库,查询数据,执行SQL脚本。
【案例演示】
添加自定义WebApi接口,实现查询数据,执行SQL脚本等功能。
注意:此案例仅做演示学习之用途,案例中实现的SQL接口有SQL注入风险(高风险),严禁在生产环境中(特别是公有云环境)使用!!!
星空公有云安全防火墙的防SQL注入机制,会拦截所有直接传入SQL参数的Http请求,也会拦截含有Execute,Delete等敏感词的Http请求,为避免浪费测试资源,您在开发自定义接口前,请提前知晓并规避这些风险。
【实现步骤】
<1>添加自定义WebApi接口类,代码如下。
using Kingdee.BOS.Log; using Kingdee.BOS.ServiceFacade.KDServiceFx; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using Kingdee.BOS.WebApi.ServicesStub; using System; using System.Linq; namespace Jac.XkDemo.BOS.WebApi { /// <summary> /// 【WebApi】访问数据库 /// </summary> public class DbService : AbstractWebApiBusinessService { public DbService(KDServiceContext context) : base(context) { // } /// <summary> /// 验证数据合法性 /// </summary> /// <param name="encryptSql">加密sql</param> /// <returns>解密后的sql</returns> private string VerifyData(string encryptSql) { if (KDContext.Session.AppContext == null) { // 会话超时,需重新登录 throw new Exception("ctx = null"); } var decryptSql = EncryptDecryptUtil.Decode2(encryptSql) as string; if (string.IsNullOrWhiteSpace(decryptSql)) { throw new Exception("sql解密异常"); } return decryptSql; } /// <summary> /// 执行SQL并返回受影响的行数 /// </summary> /// <param name="encryptSql"></param> /// <returns></returns> public int DoSth(string encryptSql) { var decryptSql = VerifyData(encryptSql); Logger.Error("Jac", "WebApi.DbService.Execute.SQL:" + decryptSql, null); return DBServiceHelper.Execute(this.KDContext.Session.AppContext, decryptSql); } /// <summary> /// 执行SQL并返回查询结果 /// </summary> /// <param name="encryptSql"></param> /// <returns></returns> public object GetDataSet(string encryptSql) { var decryptSql = VerifyData(encryptSql); Logger.Error("Jac", "WebApi.DbService.ExecuteDataSet.SQL:" + decryptSql, null); return DBServiceHelper.ExecuteDataSet(this.KDContext.Session.AppContext, decryptSql); } /// <summary> /// 执行SQL并返回查询结果 /// </summary> /// <param name="encryptSql"></param> /// <returns></returns> public object GetDynamicObject(string encryptSql) { var decryptSql = VerifyData(encryptSql); Logger.Error("Jac", "WebApi.DbService.ExecuteDynamicObject.SQL:" + decryptSql, null); return DBServiceHelper.ExecuteDynamicObject(this.KDContext.Session.AppContext, decryptSql).ToArray(); } } }
<2>拷贝WebApi接口组件到应用站点的WebSite\Bin目录下,重启IIS,开发完毕。
【功能验证】
<1>添加WebApi单元测试类,代码如下,运行单元测试代码,即可观察测试结果。
using Kingdee.BOS.Util; using Kingdee.BOS.WebApi.Client; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Data; namespace Jac.XkDemo.BOS.WebApiTests { /// <summary> /// 【WebApi】访问数据库 /// </summary> [TestClass] public class DbServiceTests { /// <summary> /// 执行SQL并返回受影响的行数 /// </summary> [TestMethod] public void DoSthTest() { #region Init // 星空站点Url var webSite = "http://localhost:1700/k3cloud/"; // 数据中心ID(账套ID) var dbId = "6371de6bdb991c"; // 登录账号 var userName = "demo"; //第三方系统应用Id var password = "888888"; // 登录语言 var lcId = 2052; #endregion #region Action // 登录 var client = new K3CloudApiClient(webSite); var loginResult = client.Login(dbId, userName, password, lcId); if (!loginResult) { Assert.IsFalse(true); return; } // 解锁管理员账号 var sql = "UPDATE T_SEC_USER SET FISLOCK=0 WHERE FUSERID=16394"; var encryptSql = EncryptDecryptUtil.Encode(sql); Console.WriteLine("请求数据包:" + encryptSql); var rval = client.Execute<int>("Jac.XkDemo.BOS.WebApi.DbService.DoSth,Jac.XkDemo.BOS.WebApi", new object[] { encryptSql }); Console.WriteLine("响应数据包:" + rval); #endregion #region Assert Assert.IsTrue(rval > 0); #endregion } /// <summary> /// 执行SQL并返回查询结果 /// </summary> [TestMethod] public void GetDataSetTest() { #region Init // 星空站点Url var webSite = "http://localhost:1700/k3cloud/"; // 数据中心ID(账套ID) var dbId = "6371de6bdb991c"; // 登录账号 var userName = "demo"; //第三方系统应用Id var password = "888888"; // 登录语言 var lcId = 2052; #endregion #region Action // 登录 var client = new K3CloudApiClient(webSite); var loginResult = client.Login(dbId, userName, password, lcId); if (!loginResult) { Assert.IsFalse(true); return; } // 查询用户信息 var sql = @"SELECT TOP 3 FUSERID,FNAME FROM T_SEC_USER; SELECT TOP 3 FORGID, FNAME FROM T_ORG_ORGANIZATIONS_L WHERE FLOCALEID = 2052;"; var encryptSql = EncryptDecryptUtil.Encode(sql); Console.WriteLine("请求数据包:" + encryptSql); var rval = client.Execute<string>("Jac.XkDemo.BOS.WebApi.DbService.GetDataSet,Jac.XkDemo.BOS.WebApi", new object[] { encryptSql }); var ds = client.Execute<DataSet>("Jac.XkDemo.BOS.WebApi.DbService.GetDataSet,Jac.XkDemo.BOS.WebApi", new object[] { encryptSql }); Console.WriteLine("响应数据包:" + rval); #endregion #region Assert Assert.IsTrue(ds != null && ds.Tables.Count == 2); Console.WriteLine("返回数据表数:" + ds.Tables.Count); Console.WriteLine("表1返回数据行数:" + ds.Tables[0].Rows.Count); Console.WriteLine("表2返回数据行数:" + ds.Tables[1].Rows.Count); #endregion } /// <summary> /// 执行SQL并返回查询结果 /// </summary> [TestMethod] public void GetDynamicObjectTest() { #region Init // 星空站点Url var webSite = "http://localhost:1700/k3cloud/"; // 数据中心ID(账套ID) var dbId = "6371de6bdb991c"; // 登录账号 var userName = "demo"; //第三方系统应用Id var password = "888888"; // 登录语言 var lcId = 2052; #endregion #region Action // 登录 var client = new K3CloudApiClient(webSite); var loginResult = client.Login(dbId, userName, password, lcId); if (!loginResult) { Assert.IsFalse(true); return; } // 查询用户信息 var sql = "SELECT TOP 3 FUSERID,FNAME FROM T_SEC_USER"; var encryptSql = EncryptDecryptUtil.Encode(sql); Console.WriteLine("请求数据包:" + encryptSql); var rval = client.Execute<string>("Jac.XkDemo.BOS.WebApi.DbService.GetDynamicObject,Jac.XkDemo.BOS.WebApi", new object[] { encryptSql }); var objs = client.Execute<User[]>("Jac.XkDemo.BOS.WebApi.DbService.GetDynamicObject,Jac.XkDemo.BOS.WebApi", new object[] { encryptSql }); Console.WriteLine("响应数据包:" + rval); #endregion #region Assert Assert.IsTrue(objs != null && objs.Length > 0); Console.WriteLine("返回数据行数:" + objs.Length); #endregion } #region 用户 /// <summary> /// 用户 /// </summary> public class User { #region propertise /// <summary> /// 用户内码 /// </summary> public int FUSERID { get; set; } /// <summary> /// 用户名 /// </summary> public string FNAME { get; set; } #endregion } #endregion } }
<2>Postman测试结果如下。
接口名称:DoSth
请求数据包:
{ "parameters": ["A//Q9DU4Yvw4/aGwdJcWY4f5fZo1qC9HdSfLjelxiZAOZWwhQZtgQd/lH5GZqW4iLsXva9w4chc="] }
返回数据包:
1
接口名称:GetDataSet
请求数据包:
{ "parameters": ["hIBTgDTz3xprgadqfzkoLex5GSNJcKj2o786JQzhhjqvTLbFEiZe2qLXM17vgpakTw3342yANMT+IykrNR1dG1kB1eS/+LKXAqJ1uxNmDkZaIb7dagk+tYynaM4z1lcG676UFjYkJ7dFiFbJGRxMHMMn8JxSVMPCRVOCjO8lbag="] }
返回数据包:
接口名称:GetDynamicObject
请求数据包:
{ "parameters": ["hIBTgDTz3xprgadqfzkoLex5GSNJcKj2o786JQzhhjqvTLbFEiZe2sdShawYaw0B"] }
返回数据包:
[{ "FUSERID": 236575, "FNAME": "00" }, { "FUSERID": 149248, "FNAME": "01" }, { "FUSERID": 207678, "FNAME": "02" }]
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.WebApi.访问数据库
【应用场景】开发自定义WebApi接口,访问数据库,查询数据,执行SQL脚本。【案例演示】添加自定义WebApi接口,实现查询数据,执行SQL脚本等...
点击下载文档
本文2024-09-23 03:59:22发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-162388.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章