天天看點

如何整合Office Web Apps至自己開發的系統(一)

在前面我的一篇部落格中 Office Web Apps安裝部署(一),有一張介紹Office Web Apps與其他系統的關系圖,

如何整合Office Web Apps至自己開發的系統(一)

從上述圖中,可知實際上Office Web Apps也是可以接入自己開發的系統的。下面介紹一下整合Office Web Apps的一些理論知識。

要想讓自己的系統與Office Web Apps整合就一定要清楚一些概念,首先要了解什麼是”WOPI”。

WOPI的英文全稱是“Web Application Open Platform Interface”,中文名為“Web應用程式開放平台接口協定”。

WOPI協定提供一系列基于web方式的,使文檔能在Office Web Apps中檢視與編輯的接口服務(Web Service)。

隻要web application按照标準,實作了WOPI的接口,那麼就可以調用Office Web Apps。例子很多,比如SharePoint,Exchange,SkyDriver,Dropbox內建Office Web Apps。

如果自己做的web應用也實作了相應接口,也是可以調用Office Web Apps的。實作文檔的線上編輯檢視。

這樣比市面上的一些基于ActiveX的線上Office産品有很大的優勢。

首先Office Web Apps是基于網頁技術,是以是跨平台的,可以在iOS,安卓,WP及PC使用,實作多屏一體。

其次Office Web Apps實作了桌面Office的大部分功能,能在客戶機沒有安裝Office的情況下,實作雲端上的文檔編輯檢視。

下面介紹的内容都是基于http協定下的,https也是類似的。

在WOPI結構中,

我們把存放Office文檔的web應用叫WOPI Host或者WOPI Server。

把檢視編輯操作Office文檔的web應用叫WOPI Client或者叫WOPI applications。

是以,Office Web Apps充當的就是WOPI Client的角色。

SharePoint,Exchange,自己開發的文檔管理系統充當的就是WOPI Host的角色。

下圖為浏覽器,server,client三者的請求順序及關系:

如何整合Office Web Apps至自己開發的系統(一)

從上圖可知,WOPI Client 向WOPI Server發送了兩次請求

1. Tell me about the file

2. Give me the file

是以WOPI client至少要提供兩個Web服務。

1. 一個是CheckFileInfo服務

此服務傳回的是請求檔案的基本資訊,WOPI Host以json方式傳回給WOPI Client.

服務URI格式一般為

HTTP://server/<...>/wopi*/files/<id>?access_token=<token>      

此服務傳回的json格式類似為:

{

"BaseFileName": "Sample Document.docx", 

"OwnerId": "tylerbutler", 

"Size": 300519,

"SHA256": "+17lwXXN0TMwtVJVs4Ll+gDHEIO06l+hXK6zWTUiYms=", 

"Version": "GIYDCMRNGEYC2MJREAZDCORQGA5DKNZOGIZTQMBQGAVTAMB2GAYA===="

}      

Json中至少要包括五個屬性:BaseFileName, OwnerId, Size, SHA256, 和 Version

BaseFileName: 檔案名。

OwnerId: 檔案所有者的唯一編号。

Size: 檔案大小,以bytes為機關。

SHA256: 檔案的256位bit的SHA-2編碼散列内容。

Version: 檔案版本号,檔案如果被編輯,版本号也要跟着改變。

更多參數介紹請參考:http://msdn.microsoft.com/en-us/library/hh622920(v=office.12).aspx

2. 一個是GetFile服務

此服務傳回的是請求檔案的内容,WOPI host以資料流的方式傳回給WOPI Client.

HTTP://server/<...>/wopi*/files/<id>/contents?access_token=<token>      

注意:CheckFileInfo與GetFile服務的URI格式隻差了一個/contents,其他地方的格式是沒有不同的。這麼做是為了讓WOPI client可以通過CheckFileInfo服務URI推導出GetFile服務的URI,千萬不要别出心裁,寫出的服務URI格式破壞了這層關系。

在上述URI格式中,都有一個access_taken身份驗證令牌。這個身份驗證令牌是必須要有的,WOPI client會把此令牌回發給WOPI Host,由WOPI Host驗證目前使用者對目前檔案的權限。是以實際上Office Web Apps根本不涉及文檔的權限管理。

我們在WOPI client上打開一個Office文檔的url位址類似如下:

http://wopi-app-server.contoso.com/wv/wordviewerframe.aspx?WOPISrc=

http%3A%2F%2Fmy-wopi-host%2Flocal%2Fwopi

%2Ffiles%2F1-Sample%2520Document.docx&access_token=

dc172034-c6f9-4a43-bc3f-d80dd93c1de1      

這個裡面有兩個傳遞參數:WOPISrc和access_token

WOPISrc參數的内容為:http://my-wopi-host/local/wopi/files/1-Sample%20Document.docx

實際上這個是WOPI Host上的CheckFileInfo服務位址。

WOPI client會通過這個位址加上access_token從WOPI host上擷取到1-Sample%20Document.docx檔案的資訊;

并且通過這個位址推導出WOPI Host上的GetFile服務位址,通過GetFile服務擷取到1-Sample%20Document.docx檔案的内容。

WOPI host上判斷什麼類型的檔案應該怎麼用WOPI client打開,WOPI client會提供一個xml檔案給WOPI host,這份xml檔案叫WOPI Discovery。格式類似如下:

<?xml version="1.0" encoding="utf-8"?>

<wopi-discovery>

<net-zone name="external-https">

<app name="Word" favIconUrl="https://wopi-app-server.contoso.com/wv/

resources/1033/FavIcon_Word.ico"

checkLicense="true">

<action name="view" ext="doc" default="true"

urlsrc="https://wopi-app-server.contoso.com/

wv/wordviewerframe.aspx?

<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>"/>

<action name="view" ext="docm" default="true"

urlsrc="https://wopi-app-server.contoso.com/

wv/wordviewerframe.aspx?

<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>"/>

……

</app>

……

</net-zone>

</wopi-discovery>      

如上所述,打開doc檔案,應該使用https://wopi-app-server.contoso.com/ wv/wordviewerframe.aspx的url打開。

WOPI host應該擷取這份檔案一次,以後打開什麼類型的檔案,調用什麼url自己判斷。