curl vs Wget

CURL

  • 基于libcurl库,libcurl是一个稳定的跨平台的类库,任何人可以免费使用其API进行开发。CURL继承了libcurl库的优良设计,这是它能成为优秀的命令行工具的重要原因。
     

  • 管道Pipes). CURL不仅仅遵循 传统UNIXstyle, 它在对输入和输出做更多的处理,贯彻了 "everything is a pipe" 的设计思想。cURL
     
  • 返回值(Return codes). curl为一系列应用返回多种结果(错误),适用于很多情况。
     
  • 单点传送 curl仅仅单点传送数据。它只会传送用户指定的URLS,并不包含任何递归下载的逻辑,也不对html进行任何解析。
     
  • 多协议支持. curl 支持的协议有: FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP 和 RTSP 在写这篇文章时,Wget仅仅支持 HTTP, HTTPS 和 FTP.
     
  • 适应更多的平台: curl比wget运行在更多的平台上面,虽然curl设计当初并没有打算这样。比如: OS/400, TPF 和其他很多非UNIX的平台。
     
  • 更强大的SSL库. curl能应用于多个不同的 SSL/TLS 库, 并提供了更多的可控性和对协议的广泛支持。
     
  • curl支持更多的 HTTP 认证方式
     
  • 双向通信. curl 提供了上传能力,Wget仅仅支持HTTP post 方式
     
  • HTTP multipart/form-data 的发送能力, 这使得用户可以进行HTTP上传,模拟浏览器的行为和HTTP认证等,提供了更多操作的可能。
     
  • 压缩. curl 支持GZIP和 inflate Content-Encoding 并且自动进行解压缩操作。

 

 

Wget

 

  • Wget 仅仅支持命令行方式运行. 没有类库,不提供API等。
  • 递归! Wget 与CURL的最大区别也是Wget的最大的优势是可以进行递归的下载,可以一次下载一个HTML页面 或者ftp列表中的所有内容。A gnu head!
  • 更久的历史. Wget 可以追溯到 1995年,curl则要在 1997年之后出现.
  • 参与开发的人员相对较. 我打赌,任何参与这两个项目的人都能感觉到这一点。
  • HTTP 1.0. Wget 仍然仅仅使用 HTTP 1.0,但是它一直工作很好,并且对于最终用户没有任何影响。curl在2001年三月的时候就开始支持 HTTP 1.1 了(仍然保留对 1.0 请求的支持).
  • GPL. Wget 100% 遵循 GPL v3 协议,. curl 则是  MIT licensed.
  • GNU. Wget 是 GNU 项目的一部分 并且所有的版权归于 FSF. curl项目则是独立的,独立于任何组织,所有的版权属于Daniel。(哇!)
  • Wget 不需要任何额外参数 就能从URL下载文件到本地, 而curl需要至少 -o 或者 -O这两个参数.

在对网站内容是否更新进行测试时,最常用的两个工具就是wget和curl。不过两个工具之间还是有一些小区别,甚至很可能影响到测试结论的。记录一下:

1、在查看response-header的时候,我们习惯用的是wget -S和curl -I,但是:wget -S的时候,发送的是GET请求,而curl -I发送的是HEAD请求。如果测试url此时没有被缓存过,直接使用curl -I进行测试,永远都会返回MISS状态。所以最好先wget一次,再用curl -I。

2、在查看下载速度时,常常发现wget和curl耗时差距较大。因为wget默认使用HTTP/1.0协议,不显式指定 –header=”Accept-Encoding: gzip,deflate”的情况下,传输的是未经压缩的文件。而curl使用HTTP/1.1协议,默认接受就是压缩格式。

3、在测试缓存层配置时,有时发现wget可以HIT的东西,curl却始终MISS。对此可以开启debug模式进行观察跟踪。
wget自带有-d参数,直接显示request-header;curl只有-D参数,在采用GET请求的时候,将response-header另存 成文件,所以只好在squid上debug请求处理流程(当然也可以去网络抓包),结果发现,curl的GET请求,都带有”Pragma: no-cache”!而wget需要另行指定–no-cache才会。按照squid的默认配置,对client_no_cache是透传的,所以 curl永远MISS,除非squid上配置了ignore-reload/reload-into-ims两个参数,才可能强制HIT。

posted on 2012-02-02 15:43  kudosharry  阅读(3297)  评论(0编辑  收藏

导航