二开案例.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格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



