學習WebDav

janbar發表於2020-10-12

前言

    在之前一篇文章【keepass+堅果雲管理我的密碼】中我使用了堅果雲的WebDav服務來讓我的KeePass實現多平臺和裝置共享資料庫檔案。然後我就想學一學WebDav是什麼,有什麼用,以及如何使用。在這之前我也用過相關網路儲存功能的服務,用來儲存我定時打包的備份檔案,當時考慮用百度網盤這類網盤工具,但是API太難用了,授權啥的也很麻煩,而且還需要建立應用,而我只想簡單的上傳和下載一下我的檔案而已。當時的解決方案是使用【gdrive】命令列工具,感覺雖然略微複雜,但仍然比百度網盤簡單(PS:別問我為啥用谷歌產品,因為伺服器在牆外)。但這次用堅果雲的WebDav讓我看到了更簡單的上傳下載網盤檔案的方案,我甚至都不用安裝額外的工具,只使用curl命令列就能實現檔案上傳下載到網盤的功能,簡直牛逼plus啊。下面就展示我學習WebDav的記錄吧。

初識WebDav

    放上【WebDAV官網】,上面關於WebDAV的介紹:簡而言之:WebDAV代表“基於Web的分散式創作和版本控制”。它是HTTP協議的一組擴充套件,允許使用者協作編輯和管理遠端web伺服器上的檔案。我理解的WebDav其實就是一個http請求而已,只是拿來做的事情是管理服務上的檔案。不過呢,通過一些特殊的規則讓伺服器對特殊的http請求進行相應的邏輯處理,使得管理伺服器檔案更方便且功能更豐富。注意:認證這塊確實比較簡陋,用Basic Auth方式認證,比較容易被攻擊。所以我一般都會為檔案進行加密,或者用別的方案保證檔案傳輸的安全性,比如KeePass使用key檔案,即使資料庫檔案被人盜用也打不開。

有哪些支援webdav的網盤?

國外網盤:Box、Dropbox、teracloud、yandex、TransIP
國內網盤:堅果雲、城通網盤
私有云:OwnCloud、Seafile 、群暉
目前國內最好用的支援webdav:堅果雲

當然支援WebDav協議的應用大家可以自行百度額,像我使用的KeePass就可以使用WebDav。好像WPS也支援,不過沒試過。這裡是堅果雲幫助裡面介紹相關應用使用WebDav【點選跳轉

WebDAV的特性和優勢

  • 支援建立、修改、複製、移動、移除、查詢、列舉檔案
  • 檔案鎖
  • 版本控制
  • 支援修改檔案屬性
  • 安全完善的身份驗證機制
  • 支援https加密
  • 支援proxy
  • 客戶端快取
  • 方便的客戶端工具:和區域網中的檔案共享一樣簡單使用。

對比ftp協議,身份驗證、加密、支援proxy、客戶端快取都是webdav的優勢。在http傳輸上,ftp一個檔案需要建立一個新連線;而webdav只要一個tcp連線,傳輸更高效。

服務端的搭建

    由於我只想用堅果雲的服務,不想自己搭建伺服器,所以沒有去了解不過Nginx官網有個配置WebDav的方式【點選跳轉】,大家有興趣可以去自己試試看。網上也有很多WebDav的伺服器,我還在GitHub上搜尋WebDav,能搜到很多伺服器的程式碼,有興趣可以自己找找看吧。

呼叫WebDav介面

    官方關於WebDav的介紹【點選跳轉】,安排的明明白白,雖然我英語比較差,但我翻譯軟體玩的賊溜,還是勉強能看懂的。注意,下面的username為堅果雲的賬號,password為堅果雲的應用密碼,不是登入密碼額,詳情看堅果雲的幫助文件吧。

PROPFIND方法

PROPFIND方法檢索在由請求URI標識的資源上定義的屬性,一般這個請求用來檢視路徑下的目錄和檔案,結果會有這些檔案的名稱和屬性等。

curl --user "username:password" --request PROPFIND https://dav.jianguoyun.com/dav/

PROPPATCH方法

PROPPATCH方法處理請求正文中指定的指令,以設定和/或刪除在由請求URI標識的資源上定義的屬性。

curl --user "username:password" --request PROPFIND https://dav.jianguoyun.com/dav/test.txt

MKCOL方法

MKCOL方法是建立目錄。

curl --user "username:password" --request PROPFIND https://dav.jianguoyun.com/dav/test

PUT方法

PUT方法用於上傳檔案。

curl --user "username:password" --request PUT https://dav.jianguoyun.com/dav/test/test.sql --data "body"
上面命令執行後,去檢視檔案內容會變為"body"

curl --user "username:password" --request PUT https://dav.jianguoyun.com/dav/test/test.sql --data @C:\body.txt
上面命令執行後,去檢視檔案內容會變為"C:\body.txt"的檔案內容

GET方法

GET方法用於下載檔案,下面命令就能方便的下載檔案。

curl --user "username:password" --request GET https://dav.jianguoyun.com/dav/test/test.sql --output test.sql

DELETE方法

DELETE方法用於刪除檔案或資料夾。

curl --user "username:password" --request DELETE https://dav.jianguoyun.com/dav/test/test.sql

COPY方法

COPY方法用於複製檔案,url為原始檔,header中的Destination為目標檔案地址。

curl --user "username:password" --request COPY https://dav.jianguoyun.com/dav/test/a/test.sql --header "Destination: https://dav.jianguoyun.com/dav/test/b/test.sql"
上面命令會將"/test/a/test.sql"複製到"/test/b/test.sql"裡面。

MOVE方法

MOVE方法用於移動檔案,url為原始檔,header中的Destination為目標檔案地址。

curl --user "username:password" --request MOVE https://dav.jianguoyun.com/dav/test/a/test.sql --header "Destination: https://dav.jianguoyun.com/dav/test/b/test.sql"
上面命令會將"/test/a/test.sql"移動到"/test/b/test.sql"裡面。

LOCK和UNLOCK方法

這兩種方法我基本不用,我看文件裡面是需要傳xml的body內容,實現也很簡單,這裡就不研究了。

總結

  1. 首先本文只是做一個簡單的介紹,以及簡單的命令列示例。如果需要自己程式設計實現,我覺得把curl命令列變成程式碼那是超級簡單的事情吧。
  2. 特別需要注意這些介面的冪等特性,我看官方文件有些有介紹的。比如有時候程式設計不檢查結果導致同個請求傳送多次,自己需要測好異常情況。
  3. 官方文件裡面有xml的請求體,用來表示不同的功能,我上面都沒有帶上,所以都是使用的預設請求。如果自己有需要就去【官方文件】自行檢視吧。

相關文章