WPS加载项是如何实现调用业务系统JS的 WPS通信原理 wpssdk
写在前面:JSAPI金山办公官方群 756432763
欢迎有问题的同学进入
反正自己也不专业,我这里就用大白话解释吧 -。-
一、业务系统调用WPS原理
WPS监听服务 端口58890(http) 58891(https) 进程:wpscloudsvr.exe
- 应用系统调用wps的SDK后,sdk把应用系统的动作封装起来 -> 访问并传参给监听服务
该监听服务(wpscloudsvr.exe)负责调起wps。实现无弹窗调起 - 同理,调用wps套红,水印等功能,也是该方法封装
整个流程图是这样的
下图是调用WPS加载项功能的请求 /transfer/runParam
参数data中 ksowebstartupwps://后面的base64编码,就是封装好的动作和参数
那当该进程被关闭时怎么办?
请求超时,则直接将浏览器地址改为ksoWPSCloudSvr://start=RelayHttpServer(意为启动该服务)进行跳转
这个是浏览器自定义协议,由wps实现 类似Ftp:// http:// 等 是通过注册表实现的
自定义协议参考 | https://www.cnblogs.com/Aricc/archive/2009/03/18/1415929.html |
---|
此时监听服务已经启动,然后需要再次点击 重复上述步骤进行调用
如图 onerror里面触发打开监听服务
二、WPS调用业务系统JS的原理
点击执行业务系统函数handleOaFunc1 ,前端弹出提示框
这个功能真的是百思不得其解,可能是我太笨了(不是 >w<)
因为误认为这个是CS端掉起,我们打开Wireshark,发现:。。 见鬼了。
只有返回没有请求
查了后端主动发消息给前端相关的内容,发现网上有说两种方法
一种是websocket 一种是SSE(Server-Sent Events)
在wps提供的demo里面找对应的关键词 “EventSource”/“WebSocket” -> 没收获
也许有经验的人肯定第一时间会想到,这个之前是有一个请求的(没错其实就是这样)
我们刷新Demo页面,发现有一条连接一直处于挂起状态/askwebnotify
当我们点击WPS里的按钮时该连接有了返回值(返回动作和参数),到这一步就是前端处理的事情了
然后随即立刻建立起下一个/askwebnotify 请求,继续挂起,直到返回
2021-7-1 更新:
这点新版本不会一直挂起了,现在的sdk方法是2秒超时,释放后再次请求。
但是当浏览器没选择该页签时,我在wps点击了多次这个执行业务系统函数handleOaFunc1 怎么办?
这里我们可以看到WPS客户端是按照消息队列进行返回的,当我们再选择页签到该页面的时候,接着收到消息,建立链接。我们的WPS依次按队列里面的动作进行返回
End
关于这个连接我们可以使用 netstat -ano 命令看端口监听情况
发现当点击这个按钮的时候 与wps监听服务58890 新建立了一个链接
50273 -> 50344