服务端插件安全调用webapi的写法--上下文原创
金蝶云社区-eris
eris
19人赞赏了该文章 2669次浏览 未经作者许可,禁止转载编辑于2021年10月20日 16:26:03

说明:

        7.5版本之前在插件中调api可能导致页面死掉,操作不成功等系列问题,原因是api接口会把上下文环境改变。

如果不是7.5版本以上,建议按下面的写法在插件中调用webapi

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.WebApi.Client;
using Kingdee.BOS.WebApi.FormService;
using Kingdee.BOS.ServiceHelper;
namespace Kingdee.BOS.TestPlugIn.FormPlugin
{
    [HotUpdate]
    [Description("插件中安全调用webapi接口写法")]
    public class InvokeWebApiInPlugIn : AbstractDynamicFormPlugIn
    {
        public override void BarItemClick(BarItemClickEventArgs e)
        {
            //第一种方式:通过客户端调用接口,先调用登陆接口,再调用其他接口,
            K3CloudApiClient apiClient = new K3CloudApiClient("http://localhost:2800/");
            var isSucc = apiClient.Login(this.Context.DBId, this.Context.UserName, "888888", 2052);
                  apiClient.Save(ctx, "KKK_BillA", "{\"Model\": {\"FBillTypeID\": {\"FNUMBER\": \"FBillANumber2\"}}"); 
           
            //第二种方式:通过克隆创建一个新的上下文,再使用克隆的上下文直接调用api接口,
                var cloneCtx = ObjectUtils.CreateCopy(ctx) as Context;
            cloneCtx.ServiceType = WebType.WebService;//写死    
            cloneCtx.ClientInfo = ctx.ClientInfo;  
            cloneCtx.CharacterSet = ctx.CharacterSet;  
            // cloneCtx.IsStartTimeZoneTransfer = ctx.IsStartTimeZoneTransfer;  
            cloneCtx.LoginName = ctx.LoginName;         
            cloneCtx.EntryRole = ctx.EntryRole;        
            // cloneCtx.Salt = ctx.Salt;      
            cloneCtx.UserPhone = ctx.UserPhone;    
            cloneCtx.UserEmail = ctx.UserEmail;    
            cloneCtx.UserLoginType = ctx.UserLoginType;      
            var result = WebApiServiceCall.Save(cloneCtx , "KKK_BillA", "{\"Model\": {\"FBillTypeID\": {\"FNUMBER\": \"FBillANumber2\"}}");
            
            //第三种方式:自行创建上下文,再使用此上下文去调用接口
            var ctx = Kingdee.BOS.ServiceHelper.DataCenterService.GetDataCenterContextByID("DBID");
            //赋值上用户
            ctx.UserId = FormConst.AdministratorID; //服务操作用户暂时记为Administrator
            ctx.UserName = "Administrator";
            ctx.ServiceType = WebType.WebSite;
            //给上下文赋值上组织
            BusinessEntity.Organizations.Organization curOrg = OrganizationServiceHelper.ReadOrgInfoByOrgId(ctx, 1);
            List<long> functions = new List<long>();
            if (!curOrg.OrgFunctions.IsNullOrEmptyOrWhiteSpace())
            {
                functions = Array.ConvertAll(curOrg.OrgFunctions.Split(','), (a) => { return Convert.ToInt64(a); }).ToList();
            }
            ctx.CurrentOrganizationInfo = new OrganizationInfo() { ID = curOrg.Id, Name = curOrg.Name, FunctionIds = functions, AcctOrgType = curOrg.AcctOrgType };
       
        }
    }
}


赞 19