前言
在之前一篇文章【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內容,實現也很簡單,這里就不研究了。
總結
- 首先本文只是做一個簡單的介紹,以及簡單的命令行示例。如果需要自己編程實現,我覺得把curl命令行變成代碼那是超級簡單的事情吧。
- 特別需要注意這些接口的
冪等
特性,我看官方文檔有些有介紹的。比如有時候編程不檢查結果導致同個請求發送多次,自己需要測好異常情況。 - 官方文檔里面有
xml
的請求體,用來表示不同的功能,我上面都沒有帶上,所以都是使用的默認請求。如果自己有需要就去【官方文檔】自行查看吧。