Web Application Open Platform Interface (WOPI). WOPI为基于Web的服务提供了一种查看和编辑OfficeWebApps中文档的方法,您可以从Office文档中获得所有高保真和丰富的文档。
概述
客户端如何使用WOPI的一个例子是为特定类型的文件提供基于浏览器的查看器。该客户端使用WOPI获取文件的内容,以便将该内容以浏览器中的网页形式呈现给用户。下图显示了如何工作的示例。
图1 使用WOPI为特定类型的文件提供基于浏览器的查看器
上图中交互过程中一个值得注意的细节是,WOPI服务器提供了“调用WOPI客户端所需的信息”。WOPI客户端提供了一种机制,通过该机制,WOPI服务器可以发现WOPI客户端的能力,以及调用这些功能的方法。(正如部署 Office Online Server中所讲到的../hosting/discovery)下图描述了这种交互:
图2 WOPI 发现
HOST实现查看文档要做什么
CheckFileInfo
简单地说,CheckFileInfo是WOPI应用程序如何获取有关文件和用户对文件的权限的信息的。
它应该有一个如下所示的URL:
http://server/<...>/wopi*/files/<id>?access_token=<token>
get method
这是WOPI应用程序将调用的主要URL,以检索有关文件的信息。您将始终在URL中收到文件ID,因此应用程序可能要求您执行的每个操作都是特定于文件的。所有WOPI操作都需要CheckFileInfo。
WOPI应用程序期望响应体中有一个JSON对象。这个JSON响应可以包含许多可选的值,这些值都在[MS-WOPI]第3.3.5.1.1.2节中讨论过,但它至少需要包括BaseFileName、OwnerId、size和Version。
GetFile
CheckFileInfo提供有关文件的信息,GetFile则返回文件流。它应该有一个如下所示的URL:
http://server/<...>/wopi*/files/<id>/contents?access_token=<token>
get method
当您收到GetFile请求时,您的响应应该包括HTTP响应主体中请求的文件的二进制内容(当然,在您验证了访问令牌和权限之后)。
HOST实现编辑文档要做什么
CheckFileInfo
http://server/<...>/wopi*/files/<id>?access_token=<token>
get method
同样是文件信息检索,但是它应该返回用户是否可以编辑文件的标识,比如UserCanWrite、SupportsUpdate等(具体仍参考[MS-WOPI]第3.3.5.1.1.2节)。
GetFile
同上
PutFile
url和GetFile一样,但是请求方法(request method)不同。
http://server/<...>/wopi*/files/<id>/contents?access_token=<token>
post method
wopi client 获取浏览器编辑的文档的内容,将二进制流发送给该PutFile服务,因此实现的时候,保存该二进制流就行了。
代码实现
可以参考 office online server实现文档的预览编辑
其他需要注意的地方
参考上面代码实现,感觉 wopi host 似乎不太安全。如果别人自己实现了一个wopi host,将host链接作为WopiSrc参数传给我们的OfficeWebApp,我们岂不是消耗了自己服务器的资源给他人做了在线查看/编辑文档服务。
解决办法,就是限制访问:
1. 指定 Office Online Server 能够访问的网站域名白名单。
New-OfficeWebAppsHost -domain "contoso.com"
则限制了只能访问 contoso.com 的 wopi host。具体请参考 Office Online Server PowerShell
2. Office Online Server 服务,一般要暴露外网地址给用户访问来提供预览编辑功能,因此第1点的域名设置是比较推荐的。
参考文档
[MS-WOPI]: Web Application Open Platform Interface Protocol
March 21, 2013 S. D. Oliver Introducing WOPI