电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

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

来源:金蝶云社区作者:金蝶2024-09-234

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

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

【应用场景】开发自定义WebApi接口,访问数据库,查询数据,执行SQL脚本。【案例演示】添加自定义WebApi接口,实现查询数据,执行SQL脚本等...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信