Page tree
Skip to end of metadata
Go to start of metadata

通过 HTTP JSON的方式,可以调用Smartbi服务器提供的所有方法(不限于 Java API文档, Java API是经过封装之后的稳定的接口),这些方法是未明确暴露的,可能在未来的版本变动的。

仅适用于Java API文档尚未支持,但项目上需要立即使用的紧急情况; 或者是调用用户自己开发的插件包中的服务接口。

 

如何知道您使用的Smartbi服务器提供哪些的方法?

方法1:通过HTTP监视工具(如HTTP Charles,或者浏览器自带的网络调试工具),可以查看到浏览器和服务器的交互数据。

以下举例说明

示例:获取我的收藏夹下的数据

首先在浏览器访问地址的末尾添加参数debug=true,如图:

 

用户登录系统后,在主界面点击我的空间,

看到charles显示如图:

 

图中charles左边的http url,我们可以得知Smartbi中大部分数据交互是通过http://ip:port/smartbi/vision/RMIServlet完成的,

然后charles右边上半部分为浏览器发起的Http的请求信息,图中可以看到Request请求体中传递了三个参数:

className=MyFavoriteService

methodName=getUserFavorite

params=["ADMIN"]

这个过程可以使用Java代码表示如下:

ClientConnector conn = new ClientConnector("http://192.168.2.100:18080/smartbi");
try {
              boolean open = conn.open("admin", "admin");// 登录
              if (open) {
                     InvokeResult result = conn.remoteInvoke("MyFavoriteService", "getUserFavorite",new Object[] { "ADMIN" });// 用户ID
                     String f_resid = (String) result.getResult();                                                                
					 System.out.println(f_resid); // 我的收藏夹id
              }
} catch (Exception e) {
       e.printStackTrace();
} finally {
       conn.close();
}


charles右边下半部分为服务器返回给浏览器的http响应,Response中响应体JSON为:

{

       "retCode": 0,

       "result": "I2c949e121d278e60011d278ec9450001",

       "duration": 4

}

再进一步点击我的收藏夹展开,看到有一个收藏资源:

此时在Charles看到请求和响应:

其中的Request中传递的参数params的值正是前面请求中的返回数据:I2c949e121d278e60011d278ec9450001,而Response的JSON数据也就是浏览器中展示的收藏资源的信息。

上述请求可以用Java代码片段表示如下:

 

InvokeResult result = conn.remoteInvoke("MyFavoriteService", "getChildElementsByCustomOrder", new Object[] { "I2c949e121d278e60011d278ec9450001" });

JSONArray arr = (JSONArray) result.getResult(); // json数组

for (int i = 0; i < arr.length(); i++) {

              JSONObject object = (JSONObject) arr.get(i);

              System.out.println("alias="+object.get("alias")); // 资源别名

}

 

 

整个完整过程用Java代码调用表示如下(含部分字段注释):

 

ClientConnector conn = new ClientConnector("http://192.168.2.100:18080/smartbi");

try {

       boolean open = conn.open("admin", "admin");// 登录

       if (open) {

              InvokeResult result = conn.remoteInvoke("MyFavoriteService", "getUserFavorite",new Object[] { "ADMIN" });// 用户ID

              String f_resid = (String) result.getResult(); // 我的收藏夹id

              result = conn.remoteInvoke("MyFavoriteService", "getChildElementsByCustomOrder", new Object[] {f_resid});

              JSONArray arr = (JSONArray) result.getResult(); // json数组

              for (int i = 0; i < arr.length(); i++) {

                 JSONObject object = (JSONObject) arr.get(i);

                 System.out.println("realNodeId="+object.get("realNodeId")); // 资源实际id 对应右键资源属性的节点ID

          System.out.println("favId="+object.get("id")); // 资源在我的收藏夹中的id,与资源实际id不一致

          System.out.println("alias="+object.get("alias")); // 资源别名

           System.out.println("name="+object.get("name")); // 资源名称

			System.out.println("hasChild="+object.getBoolean("hasChild")); // 是否有子节点  有子节点的是文件夹,值为true

              }

       }

} catch (Exception e) {

       e.printStackTrace();

}finally{

       conn.close();

}

 

执行结果如下图:

综上,Java调用服务端方法主要是使用smartbi.sdk.ClientConnector的实例方法
remoteInvoke(java.lang.String classname, java.lang.String method, java.lang.Object[] params) 
远程调用接口实现数据交互。因此,遇到Java api中找不到的服务对象但是产品内部有接口支持的情况,都可以按上述方式调用。

 

方法2:咨询Smartbi技术支持。

 

 

  • No labels