`
bluky999
  • 浏览: 719607 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

curl的基本使用及libcurl

阅读更多

1 curl 是一个强大的命令行工具,一般被称为下载工具;其实curl可以执行HTTP HTTPS FTP等协议的绝大部分请求,完成一般windows等系统上下载工具的绝大多数功能。

 

网址: http://curl.haxx.se/   [没错,来自瑞典]

CURL 写道
curl is a command line tool for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks.

 

CURL 写道
Curl is free and open software that compiles and runs under a wide variety of operating systems. Curl exists thanks to efforts from many contributors.

The most recent stable version of curl is version 7.22.0, released on 13th of September 2011. Currently, 110 of the listed archives are of the latest version.

 


2 CURL的基本使用

 

网络 写道
1、获得一张页面
使用命令:curl http://curl.haxx.se
这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将不显示文件头部,即HTML文档的header。要全部显示,请加参数 -i,要只显示头部,用参数 -I。任何时候,可以使用 -v 命令看curl是怎样工作的,它向服务器发送的所有命令都会显示出来。为了断点续传,可以使用-r参数来指定传输范围。


2、表单(Form)的获取
在WEB页面设计中,form是很重要的元素。Form通常用来收集并向网站提交信息。提交信息的方法有两种,GET方法和POST方法。先讨论GET方法,例如在页面中有这样一段:
<form method="GET" action="junk.cgi">
<input type=text name="birthyear">
<input type=submit name=press value="OK">
</form>
那么浏览器上会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,表单就用GET方法向服务器提交文本框的数据。例如原始页面是在www.hotmail.com/when/birth.html看到的,然后您在文本框中输入1905,然后按OK按钮,那么浏览器的URL现在应该是:“www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK”
对于这种网页,curl可以直接处理,例如想获取上面的网页,只要输入:
curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
就可以了。
表单用来提交信息的第二种方法叫做POST方法,POST方法和GET方法的区别在于GET方法使用的时候,浏览器中会产生目标URL,而POST不会。类似GET,这里有一个网页:
<form method="POST" action="junk.cgi">
<input type=text name="birthyear">
<input type=submit name=press value="OK">
</form>
浏览器上也会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,表单用POST方法向服务器提交数据。这时的URL是看不到的,因此需要使用特殊的方法来抓取这个页面:
curl -d "birthyear=1905&press=OK" www.hotmail.com/when/junk.cgi
这个命令就可以做到。
1995年年末,RFC 1867定义了一种新的POST方法,用来上传文件。主要用于把本地文件上传到服务器。此时页面是这样写的:
<form method="POST" enctype='multipart/form-data' action="upload.cgi">
<input type=file name=upload>
<input type=submit name=press value="OK">
</form>
对于这种页面,curl的用法不同:
curl -F upload=@localfilename -F press=OK [URL]
这个命令的实质是将本地的文件用POST上传到服务器。有关POST还有不少用法,用户可以自己摸索。


3、使用PUT方法。
HTTP协议文件上传的标准方法是使用PUT,此时curl命令使用-T参数:
curl -T uploadfile www.uploadhttp.com/receive.cgi


4、有关认证。
curl可以处理各种情况的认证页面,例如下载用户名/密码认证方式的页面(在IE中通常是出现一个输入用户名和密码的输入框):
curl -u name:password www.secrets.com
如果网络是通过http代理服务器出去的,而代理服务器需要用户名和密码,那么输入:
curl -U proxyuser:proxypassword http://curl.haxx.se
任何需要输入用户名和密码的时候,只在参数中指定用户名而空着密码,curl可以交互式的让用户输入密码。


5、引用。
有些网络资源访问的时候必须经过另外一个网络地址跳转过去,这用术语来说是:referer,引用。对于这种地址的资源,curl也可以下载:
curl -e http://curl.haxx.se daniel.haxx.se


6、指定用户客户端。
有些网络资源首先需要判断用户使用的是什么浏览器,符合标准了才能够下载或者浏览。此时curl可以把自己“伪装”成任何其他浏览器:
curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
这个指令表示curl伪装成了IE5.0,用户平台是Windows 2000。(对方服务器是根据这个字串来判断客户端的类型的,所以即使使用AIX也无所谓)。使用:
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
此时curl变成了Netscape,运行在PIII平台的Linux上了。


7、COOKIES
Cookie是服务器经常使用的一种记忆客户信息的方法。如果cookie被记录在了文件中,那么使用命令:
curl -b stored_cookies_in_file www.cookiesite.com
curl可以根据旧的cookie写出新cookie并发送到网站:
curl -b cookies.txt -c newcookies.txt www.cookiesite.com


8、加密的HTTP——HTTPS。
如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:
curl https://that.secure.server.com


9、http认证。
如果是采用证书认证的http地址,证书在本地,那么curl这样使用:
curl -E mycert.pem https://that.secure.server.com

参考读物和注意事项:curl非常博大,用户要想使用好这个工具,除了详细学习参数之外,还需要深刻理解http的各种协议与URL的各个语法。这里推荐几个读物:
RFC 2616 HTTP协议语法的定义。
RFC 2396 URL语法的定义。
RFC 2109 Cookie是怎样工作的。
RFC 1867 HTTP如何POST,以及POST的格式。

 

 

注 平常使用最多的且容易碰到问题的功能与选项如下:

1 cookie的保存与重用;

 

2 POST请求的提交;

 

3 文件的上传;

 

4 HTTPS的支持,或Basic认证;

 

5 referer的设置;

 

6 URL重定向 -L 参数;

 

7 下载文件时指定 range 以支持断点续传,或多worker下载。

 

 

3  libcurl http://curl.haxx.se/libcurl/

curl背后所使用的库就叫 libcurl,所以你也可以在你自己的程序或项目中使用libcurl以获得类似CURL的强大功能。

 

libcurl 写道
libcurl is a free and easy-to-use client-side URL transfer library, supporting DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP. libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, Kerberos), file transfer resume, http proxy tunneling and more!

libcurl is highly portable, it builds and works identically on numerous platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS and more...

libcurl is free, thread-safe, IPv6 compatible, feature rich, well supported, fast, thoroughly documented and is already used by many known, big and successful companies and numerous applications.
 

 

TIPS

如果你使用 libcurl 从HTTP服务器上下载文件的时候,一切正常,返回200,但就是没有数据,那么请检查你的HTTP文件服务器返回的HEADER里是否明确指定了 Content-Length字段; 如果该字段未明确指定或者为0,那么即使再大的文件也不会下载成功。

 

这应该不是libcurl的Bug,而是为了支持标准的HTTP协议头信息,忽略容错能力。

 

分享到:
评论
1 楼 bluky999 2011-11-14  
顺便推荐 PYcURL    http://pycurl.sourceforge.net/

相关推荐

    java通过jni调用libcurl,curl java

    libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证。 PHP自带curl扩展,但java没有curl扩展,这个工程的目的,就是将...

    使用VC6编译-Curl和LibCurl+ssl+ssh2+zlib

    使用VC6编译-Curl和LibCurl+ssl+ssh2+zlib libcurl是一个跨平台的开源网络协议库,支持http, https, rtsp等多种协议 。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,...

    ESP32_curl_example-master.zip_ESP32 CURL_curl esp32_esp32 cmake_

    本项目重点在于将libcurl库移植到ESP32平台上,以便利用CURL库的功能在ESP32设备上执行HTTP和其他网络协议的请求。libcurl是一个开源的库,支持多种互联网协议,包括HTTP、HTTPS、FTP等,使得开发者可以方便地在应用...

    mac平台curl库源码编译libcurl

    这个资源蓝本在libcurl源码+openssl : “http://download.csdn.net/detail/yq910902/9458278”当中。12年时候的编译文档,有一些不太适合现在的情况,编译文档做了一些修改。在reademe.txt当中有说明

    curl-7.79.1.rar_libcurl.lib源码,含教程说明

    "使用说明.txt"文件很可能是CURL库的安装和使用指南,它会包含编译libcurl的步骤、如何在项目中链接libcurl、设置选项以及调用示例等内容。这些信息对于初学者来说至关重要,因为它们将指导如何正确地集成和使用CURL...

    资源包含了基于curl-7.67.0版本编译的debug和release兼容xp的curl.exe,libcurl.dll,libcurl.lib文件

    这包括了`curl.exe`(命令行工具)、`libcurl.dll`(动态链接库)和`libcurl.lib`(静态链接库),分别对应于debug和release构建模式。 **curl.exe** 是一个可执行文件,用户可以通过命令行界面来执行HTTP、FTP等...

    vc6.0 libCurl 简单使用

    **VC6.0 libCurl 简单使用** libCurl 是一个广泛使用的开源库,主要用于处理URL传输,支持多种网络协议,如HTTP、HTTPS、FTP、FTPS等。在Windows环境中,尤其是在Visual C++ 6.0(简称VC6.0)这样的老版本开发工具...

    libcurl 使用vs2010编译的动态库和静态库(包含的debug和release版和头文件)

    3. 初始化与清理:使用libcurl时,需要调用`curl_global_init()`初始化,结束时调用`curl_global_cleanup()`。 4. 设置选项:通过`curl_easy_setopt()`函数设置请求参数,如URL、数据传输方式等。 5. 执行请求:...

    go-curl, golang curl(libcurl) 绑定.zip

    go-curl, golang curl(libcurl) 绑定 curl 我的golang libcurl(curl) 绑定。请参阅./examples/directory~中的更多示例 !许可证转到curl许可在Apache许可下,版本 2.0 ( http://www.apache.o

    libcurl移植到嵌入式ARM以及使用参考

    curl库的主要功能是用不同的协议连接不同的服务器,也就是相当封装了的socket的协议库, libcurl当前支持http, https, ftp, gopher, ...内容描述移植到嵌入式ARM的完整步骤,以及使用libcurl库开发应用的示例代码。

    使用libcurl获取经过gzip压缩的网页文件

    首先,理解libcurl的基本工作原理。libcurl是一个C语言库,提供了一系列函数接口,用于在各种协议下传输数据。对于HTTP协议,libcurl可以设置请求头来告知服务器客户端支持gzip压缩,这样服务器就会返回压缩过的响应...

    curl和libcurl的区别简介

    curl 和 libcurl 的主要区别在于它们的使用场景。curl 适用于快速执行一次性或脚本化的网络任务,而 libcurl 更适合在软件开发中,为应用程序提供网络通信能力。curl 可以看作是 libcurl 功能的轻量级外壳,方便非...

    使用libcurl源码下载的vs工程

    【标题】"使用libcurl源码下载的VS工程"涉及的核心知识点主要是在Visual Studio(VS)2008环境下配置和使用libcurl库进行网络数据传输。libcurl是一个开源的库,它允许开发者通过多种协议(如HTTP、FTP、SMTP等)...

    编译好的 curl 的arm linux 版本

    【标题】"编译好的 curl 的arm linux 版本"涉及的主要知识点是关于软件构建、跨平台移植以及网络通信库的使用。 curl 是一个著名的开源命令行工具和库,用于在命令行下执行HTTP、HTTPS和其他多种网络协议的请求。它...

    Qt+libcurl实现FTP文件上传和下载

    在Qt中,你可以创建一个Curl对象,使用libcurl API设置FTP会话参数,如认证信息、文件路径等。确保在会话结束时正确关闭连接。 **文件上传** 对于FTP文件上传,你需要设置`CURLOPT_UPLOAD`选项,并提供本地文件的...

    curl-rust libcurl alexcrichton / curl-rust — libcurl绑定-Rust开发

    Rust文档快速入门的curl-rust libcurl绑定使用std :: io :: {stdout,Write}; 使用curl :: easy :: Easy; //将网页打印到用于Rust文档的curl-rust libcurl绑定的stdout上,以快速入门Rust使用std :: io :: {stdout,...

    libcurl.lib,libcurl.dll 编译好的,包含64位,32位,头文件

    例如,`#include &lt;curl/curl.h&gt;`是常用的头文件,它定义了初始化和使用libcurl的基本接口。 在开发过程中,64位和32位版本的选择取决于你的应用程序目标平台。如果你打算在64位操作系统上运行程序,应使用64位版本...

    windows+vs2019+debug+x64+libcurl

    注意,使用libcurl时需要处理错误,例如通过`curl_easy_strerror()`获取错误信息。另外,libcurl支持异步操作,如果你的应用需要处理多个并发请求,可以利用多线程或多会话功能。 对于HTTPS请求,libcurl默认使用...

    c++使用libcurl上传和下载资源

    上传资源通常涉及POST请求,使用`libcurl`可以通过`curl_easy_setopt`函数设置请求方法和数据。以下是一个简单的示例: ```cpp #include &lt;curl/curl.h&gt; #include void uploadFile(const std::string& url, const ...

    vc++使用libcurl下载文件,支持断点续传,支持多文件下载

    对于多文件下载,可以使用libcurl的多接口(`curl_multi_init()`和`curl_multi_add_handle()`)。这个接口允许同时处理多个下载请求,提高效率。你需要在回调函数中处理每个下载的进度,比如检查错误、更新UI或控制...

Global site tag (gtag.js) - Google Analytics