學習WebDav


前言

    在之前一篇文章【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 PROPPATCH https://dav.jianguoyun.com/dav/test.txt

MKCOL方法

MKCOL方法是創建目錄。

curl --user "username:password" --request MKCOL 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的請求體,用來表示不同的功能,我上面都沒有帶上,所以都是使用的默認請求。如果自己有需要就去【官方文檔】自行查看吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM