前言 在之前一篇文章【keepass+坚果云管理我的密码】中我使用了坚果云的WebDav服务来让我的KeePass实现多平台和设备共享数据库文件。然后我就想学一学WebDav是什么,有什么用,以及如何使用。在这之前我也用过相关网络存储功能的服务,用来保存我定时打包的备份文件,当时考虑用百度网盘这类网盘工具,但是API太难用了,授权啥的也很麻烦,而且还需要创建应用,而我只想简单的上传和下载一下我的文件而已。当时的解决方案是使用【gdrive:https://github.com/prasmussen/gdrive】命令行工具,感觉虽然略微复杂,但仍然比百度网盘简单(PS:别问我为啥用谷歌产品,因为服务器在墙外)。但这次用坚果云的WebDav让我看到了更简单的上传下载网盘文件的方案,我甚至都不用安装额外的工具,只使用curl命令行就能实现文件上传下载到网盘的功能,简直牛逼plus啊。下面就展示我学习WebDav的记录吧。初识WebDav 放上【WebDAV官网:http://www.webdav.org/】,上面关于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【https://help.jianguoyun.com/?s=WebDav】WebDAV的特性和优势支持创建、修改、复制、移动、移除、查询、列举文件文件锁版本控制支持修改文件属性安全完善的身份验证机制支持https加密支持proxy客户端缓存方便的客户端工具:和局域网中的文件共享一样简单使用。对比ftp协议,身份验证、加密、支持proxy、客户端缓存都是webdav的优势。在http传输上,ftp一个文件需要建立一个新连接;而webdav只要一个tcp连接,传输更高效。服务端的搭建 由于我只想用坚果云的服务,不想自己搭建服务器,所以没有去了解,不过Nginx官网有个配置WebDav的方式【http://nginx.org/en/docs/http/ngx_http_dav_module.html】,大家有兴趣可以去自己试试看。网上也有很多WebDav的服务器,我还在GitHub上搜索WebDav,能搜到很多服务器的代码,有兴趣可以自己找找看吧。调用WebDav接口 官方关于WebDav的介绍【http://webdav.org/specs/rfc4918.html#http.methods.for.distributed.authoring】,安排的明明白白,虽然我英语比较差,但我翻译软件玩的贼溜,还是勉强能看懂的。注意,下面的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.txtMKCOL方法MKCOL方法是创建目录。curl –user "username:password" –request MKCOL https://dav.jianguoyun.com/dav/testPUT方法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.sqlDELETE方法DELETE方法用于删除文件或文件夹。curl –user "username:password" –request DELETE https://dav.jianguoyun.com/dav/test/test.sqlCOPY方法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的请求体,用来表示不同的功能,我上面都没有带上,所以都是使用的默认请求。如果自己有需要就去【http://webdav.org/specs/rfc4918.html#http.methods.for.distributed.authoring】自行查看吧。
本文出自快速备案,转载时请注明出处及相应链接。