Webservice EASLogin登录接口说明(本文章不再更新维护,请移步新文章)原创
金蝶云社区-王育权
王育权
26人赞赏了该文章 3万次浏览 未经作者许可,禁止转载编辑于2021年04月23日 16:33:38
summary-icon摘要由AI智能服务提供

本文通知原文章不再更新维护,并指引读者到新文章查看接口说明。文中详细介绍了如何根据端口类型(实例端口或群集端口)配置EAS的安全模式和高可用WebService方案。包括修改配置文件启用安全模式、调用WebService时传递SessionID以保持会话、以及Java和C#等不同语言的具体实现方法。还提供了登录接口的参数说明和常见问题解决方案。

由于运营调整,本文章不再更新维护,具体的接口说明请移步新文章

https://vip.kingdee.com/article/173164492883473920


请确认调用方用的端口是eas的具体实例端口还是群集端口,实例端口参照“安全模式”方案实施,群集端口一定要用“高可用webservice方案技术方案(连接集群端口)”方案。 


由于网页排版问题,如果不全,详细信息请下载附件中文档查看  。


 一,安全模式(只适用实例端口注意:85版本以后实例端口不能是实例1
1)启用安全模式。修改eas\Server\eas\server\profiles\server1~N\config\webservice.propetties文件,另起一行,添加参数如下:
    isRomoteLocate=false   (注意参数名和值不要写错,可直接复制过去)
    是否启用成功测试方法(群集端口同用):
    客户端set-url.bat 端口连接设置成与webserivce调用对应的实例或集群的端口一致,然后在查询分析器分步执行服务端脚本:      com.kingdee.bos.webservice.WSConfig.init()  --调用webservice.properties方法初始配置      com.kingdee.bos.webservice.WSConfig.getRomoteLocate()  --获取安全模式设置参数,返回result:false就是成功启用了安全模式。否则失败,请检查安全模式的配置文件。


2)修改参数后,webservice调用端需要把登录返回的session传过去,java调用示例如下,其它语言调用参考EASLoginProxy  proxy =null;
   WSContext context = null;
   //登录
   proxy = new  EASLoginProxyServiceLocator().getEASLogin();
   context= proxy.login("kdjgf", "",  "eas", "zs70sp5", "l2", 1);
   if(context. getSessionId() == null ){
       throw new Exception(“login fail”);
   }
   //具体业务调用
   String[][] vouchers= null;
   WSGLWebServiceFacadeSrvProxy proxyWS= null;
   proxyWS = new  WSGLWebServiceFacadeSrvProxyServiceLocator().getWSGLWebServiceFacade();
   //设置登录返回的session在soap头 "http://login.webservice.bos.kingdee.com"是固定的
   ((Stub) proxyWS).setHeader("http://login.webservice.bos.kingdee.com","SessionId", context.getSessionId());

      其本质是,每次WEBSERVICE 访问,必须带上相关的 SessionID 信息,如下红字部分。系统将根据 SOAP头中的SessionID 信息,获取相关的上下文信息。


 
     
 
 
     
         
         
     
 

补充,donet/C#调用方式,需要部署私包sp_SOAPHead_forDoNet_V15.jar(文末附件提供),部署路径:server/lib/sp
[table]
[tr][td=641]1). 生成代理类,代理类中加入头信息变量定义public KDSessionId SessionId;//头信息要与接口中的相对应
2). 代理类中在需要调用的方法上加上参数[SoapHeader("SessionId")] //与类中定义的头同名
3). 定义头信息类      //      // 头信息,需要与接口定义的头同名      //      public class KDSessionId: SoapHeader      {          public string SessionId;//变量名与接口定义同名      }4). 调用      WSGLWebServiceFacadeSrvProxyService webuser= new WSGLWebServiceFacadeSrvProxyService();      webuser.SessionId = new KDSessionId() {SessionId = wscontext.sessionId };      webuser.deleteVoucher("03.02","2016.01", "1", "1");

二,高可用webservice方案技术方案(适用集群端口和实例端口)
1. 启用安全模式。修改eas\Server\eas\server\profiles\server1~N\config\webservice.propetties文件,另起一行,添加参数如下:
    isRomoteLocate=false   (注意参数名和值不要写错,可直接复制过去)
    2. 在服务端server-config.wsdd(路径:eas/server/deploy/eas.ear/web.war/WEB-INF)的全局参数部分,添加scope的范围:         保证服务端返回设置jsessionid的cookie。如果缓存更新不及时,手动删除web的缓存目录/apusic/domains/server(1~N)/deploy/EAS/tmpfiles。
3,(java)      在webservice客户端调用处设置call.setMaintainSession(true); 保证axis自动携带cookie到服务端     注意,调用业务方法的时候使用登录接口时的同个call实例,不要新建。
例如:[code]//调用登陆接口
Service s=new Service();
Call call=(Call)s.createCall();
call.setOperationName("login");
call.setTargetEndpointAddress("http://localhost:8080/ormrpc/services/EASLogin?wsdl");
call.setReturnType(new QName("urn:client","WSContext"));
call.setReturnClass(WSContext.class);
call.setReturnQName(new QName("","loginReturn"));
//超时
call.setTimeout(Integer.valueOf(1000*600000*60));
call.setMaintainSession(true);
//登陆接口参数
WSContext rs=(WSContext)call.invoke(new Object[]{"am", "", "eas", "bos80demo", "l2", Integer.valueOf(0)});
if(rs. getSessionId() == null){
       throw new Exception(“login fail”);
}
System.out.println(rs.getSessionId());
//清理
call.clearOperation();
//调用业务接口
call.setOperationName("addTest");
call.setTargetEndpointAddress("http://localhost:8080/ormrpc/services/WStettreeFacade");
//call.setReturnType(new QName("urn:lang.java","String"));
//call.setReturnClass(String.class);
call.setReturnQName(new QName("","addTestReturn"));
call.setTimeout(Integer.valueOf(1000*600000*60));
call.setMaintainSession(true);
//设置登录返回的session在soap头 "http://login.webservice.bos.kingdee.com"是固定的
SOAPHeaderElement header=new SOAPHeaderElement("http://login.webservice.bos.kingdee.com","SessionId", rs.getSessionId());
call.addHeader(header);
//接口参数
String aa=(String)call.invoke(new Object[]{"test1", "test"} );
[/code]

Call方式里ReturnQName ReturnClass等参数设置可以从实例端口方式发布生成的代理类Stub里抄。详见附件中登录接口说明文档


(C#)1. 设置System.Net.ServicePointManager.Expect100Continue = false;
2. 在登录接口和业务接口代理类的CookieContainner设置成同一个。

如此会正常设置jsessionid,而ngnix,f5等负载均衡通过jsessionid做会话粘帖,可满足高可用方案。通过EAS的nap做负载均衡方案,通过nap自己设置的NAPRoutIDcookie做负载均衡转发,只需设置第二步即可。[table]
[tr][td=568]  其他语言同理,保证2次请求的请求头Cookie里的JSESSIONID EASSESSIONIDNAPRoutID一致就能实现会话粘贴

三,接口参数说明
1. login(String userName, String password, String slnName,String dcName, String language, int dbType, String authPattern,int isEncodePwd)[code]userName 用户名 ,
password 密码 ,
slnName 解决方案名称 默认为eas,
dcName 数据中心id 可在管理控制台的数据中心界面查询(数据中心代码),
language 语言 (l1,l2,l3),
dbType 数据库类型(MS SQL Server:0,DB2 UDB:1,Oracle:2,MS SQL Server:3),
authPattern 验证方式 默认 "BaseDB" ; 其他认证方式KEY可从easAuthPatterns.xml中获取 ,
isEncodePwd  密码是否加密方式传递,0未加密,1加密[/code]
2.login(String userName, String password, String slnName,String dcName, String language, int dbType, String authPattern)


[code]isEncodePwd 默认为0,不加密方式[/code]
3.login(String userName, String password, String slnName,String dcName, String language, int dbType)

[code]authPattern验证方式 默认 "BaseDB"  ,isEncodePwd 默认为0,不加密方式[/code]

四,https详见附件:EAS登录接口说明文档(WebService).docx


四,常见问题:

RMIException为服务器开启了安全模式,但调用方没处理好。根据上面的说明调整调用方就可以了。