通过 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技术支持。