二开案例.WebApi.访问数据库

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.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

请求Url:http://localhost:1700/k3cloud/Jac.XkDemo.BOS.WebApi.DbService.DoSth,Jac.XkDemo.BOS.WebApi.common.kdsvc

请求数据包:

{
    "parameters": ["A//Q9DU4Yvw4/aGwdJcWY4f5fZo1qC9HdSfLjelxiZAOZWwhQZtgQd/lH5GZqW4iLsXva9w4chc="]
}

返回数据包:

1


接口名称:GetDataSet

请求Url:http://localhost:1700/k3cloud/Jac.XkDemo.BOS.WebApi.DbService.GetDataSet,Jac.XkDemo.BOS.WebApi.common.kdsvc

请求数据包:

{
    "parameters": ["hIBTgDTz3xprgadqfzkoLex5GSNJcKj2o786JQzhhjqvTLbFEiZe2qLXM17vgpakTw3342yANMT+IykrNR1dG1kB1eS/+LKXAqJ1uxNmDkZaIb7dagk+tYynaM4z1lcG676UFjYkJ7dFiFbJGRxMHMMn8JxSVMPCRVOCjO8lbag="]
}

返回数据包:


接口名称:GetDynamicObject

请求Url:http://localhost:1700/k3cloud/Jac.XkDemo.BOS.WebApi.DbService.GetDynamicObject,Jac.XkDemo.BOS.WebApi.common.kdsvc

请求数据包:

{
    "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脚本等...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息