`

curl c api

阅读更多

curl c api


关于Curl的介绍很多,这里不详细介绍,主要谈一下简单应用。


最近研究了一下Linux下的curl C API,curl c API的文档比较丰富,唯一就是查找起来,费些时间。Curl的C API和curl的PHP API,函数接口和作用大致相同,所以如果有PHP API使用经验应该很好理解。


1:CURLcode curl_global_init(long flags);函数,这个函数全局需要调用一次(多次调用也可以,不过没有必要), 所以这也是把Curlplus设计成单体类的原因,curl_global_init函数在其他libcurl函数调用前至少调用一次,程序最后需要调用curl_global_cleanup,进行清理。

参数:flags 

CURL_GLOBAL_ALL Initialize everything possible. This sets all known bits.


CURL_GLOBAL_SSL Initialize SSL


CURL_GLOBAL_WIN32 Initialize the Win32 socket libraries.


CURL_GLOBAL_NOTHING Initialise nothing extra. This sets no bit.


CURLcode 是一个enum,当CURLcode为CURLE_OK时,表示函数执行成功,否则失败,具体错误原因可以查看<curl/curl.h>文件内的定义。


2:curl_easy_init - Start a libcurl easy session

curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup函数清理. 一般curl_easy_init意味着一个会话的开始. 它的返回值是CURL *,curl_easy_init函数是线程相关的,也就是说不能在一个线程中调用另外一个线程通过curl_easy_init创建的CURL指针。


3:CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); 


描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.,要想具体了解CURL的行为,必须对CURLoption有足够的了解,具体可以参考


http://curl.haxx.se/libcurl/c/curl_easy_setopt.html


这里有两个类型不易理解CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA


curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Curlplus::writer);


设置一个回调函数,这个回调函数的格式是


size_t function( void *ptr, size_t size, size_t nmemb, void *stream);


ptr,返回数据的指针


size,返回数据每块的大小


nmemb,返回数据的块数(这里返回数据串的真正大小为size*nmemb)


stream,是curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); 中的buffer的指针。


在上面的例子中,buffer设置为一个string对象,所以,在回调函数writer中有了writerData->append(data, len); 


4:CURLcode curl_easy_perform(CURL *handle);


执行远程请求


参考资料

http://curl.haxx.se/

http://curl.haxx.se/lxr/source/docs/examples/


基于curl 的C API写了一个扩展C++ singleton类(当然curl也有C++ API),这个单体类只是对HTTP请求做了简单封装,提供post,get方法,并得到请求url内的返回值(保存到string对象中),也很容易扩展到其他协议上去。


Curlplus.h文件


#ifndef _CURLPLUS_H__

#define _CURLPLUS_H__ 


#ifndef __CURL_CURL_H

#include <curl/curl.h>

#endif


#ifndef __CURL_EASY_H

#include <curl/easy.h>

#endif


#include <memory>

#include <string> 


using namespace::std; 


namespace CP

{

    class Curlplus

    {

    public:

        static  Curlplus& get_instance();

        string post(const string& url,const string& content) const;

        string get(const string& url) const;

    protected:

        Curlplus(void);

        ~Curlplus(void);

        Curlplus(const Curlplus&);

        Curlplus& operator=(const Curlplus&);

        static int writer(char *data, size_t size, size_t nmemb,std::string *writerData);

    private:

        static auto_ptr<Curlplus> _instance;

        inline void _setCurlopt(CURL *curl,const string& url) const;

        // default timeout 300s

        static const int _defaulttimeout = 300;

        static string buffer;

        friend class auto_ptr<Curlplus>;

    };

}


#endif 


Curlpuls.cc文件 


#ifndef SPIVOT_CURLPLUS_H__

#include "Curlplus.h"

#endif 


using namespace std;

using namespace CP;

 


auto_ptr<Curlplus> Curlplus::_instance;

string Curlplus::buffer;

static char errorBuffer[CURL_ERROR_SIZE]; 


Curlplus& Curlplus::get_instance()

{

    if(_instance.get() == NULL)

    {

        _instance.reset(new Curlplus());

    } 


    return *_instance.get();

}


int Curlplus::writer(char *data, size_t size, size_t nmemb, string *writerData)

{

    if (writerData == NULL)

        return 0;

    int len = size*nmemb;

    writerData->append(data, len);


    return len;

}


Curlplus::Curlplus(void)


    CURLcode code = curl_global_init(CURL_GLOBAL_ALL);

    if(code != CURLE_OK)

    {

        cout << "curl_init failed, error code is: " << code;

    }

}


Curlplus::~Curlplus(void)

{

    curl_global_cleanup();


string Curlplus::post(const string& url, const string& content) const

{

    buffer="";

    CURL *curl = curl_easy_init();

    if(curl == NULL)

    {

        cout << "curl_easy_init failed ";

    }  


    _setCurlopt(curl,url);

    curl_easy_setopt(curl, CURLOPT_POST, 1 );

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, content.c_str());   


    CURLcode code = curl_easy_perform(curl);

    if(code != CURLE_OK)

    {

        cout << "curl_easy_perform failed: "<< code;

    }

    curl_easy_cleanup(curl);


    return buffer;


string Curlplus::get(const string& url) const

{

    buffer="";

    CURL *curl = curl_easy_init();

    if(curl == NULL)

    {

        cout << "curl_easy_init failed ";

    }  


    _setCurlopt(curl,url);

    CURLcode code = curl_easy_perform(curl); 


    if(code != CURLE_OK)

    {

        cout << "curl_easy_perform failed: "<< code;

    }

    curl_easy_cleanup(curl);

    return buffer;

}


void Curlplus::_setCurlopt(CURL *curl,const string& url) const {

    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);

    curl_easy_setopt(curl, CURLOPT_HEADER, 0);

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

    curl_easy_setopt(curl, CURLOPT_TIMEOUT, _defaulttimeout);

    //curl_easy_setopt(curl, CURLOPT_VERBOSE, true);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Curlplus::writer);

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);


}

分享到:
评论

相关推荐

    curl访问webapi的一个demo

    `curl`库不仅可以在命令行中使用,还可以被集成到C/C++、Java、Python等多语言的程序中,方便进行网络数据传输。在C++环境中,`curl`库通常通过API调用来实现网络请求。 ### 安装与配置 在Windows环境下,`curl`库...

    curl下载curl包下载

    例如,开发者常使用`curl`与API交互,获取或发送JSON数据。通过管道(`|`)或重定向(`&gt;`), `curl`可以与其他命令结合,实现复杂的自动化任务。 在压缩包`curl文件`中,可能包含了不同版本的`curl`,包括源代码、预...

    CURL 源码和实例

    1. **src目录**:这是CURL的核心源代码,包含了许多.c文件,如`curl.c`(主程序入口)、`transfer.c`(负责数据传输)、`multi.c`(处理多线程或多路复用请求)等。通过阅读这些源码,你可以了解CURL如何处理网络...

    curl_自定义进度条

    首先,我们需要创建一个C语言的回调函数,该函数将接收四个参数:`dltotal`(总下载大小),`dlnow`(已下载大小),`ultotal`(总上传大小),`ulnow`(已上传大小)。例如: ```c int progress_callback(void *...

    Curl HTTP客户端源码,用于访问WEB服务器

    Curl库的核心是使用ANSI C编写,这使得Curl具有高度的可移植性,能够在各种操作系统和硬件平台上运行,包括但不限于Windows、Linux、Mac OS X以及各种嵌入式系统。ANSI C是一种标准的C语言版本,它的语法和库函数被...

    lua-cURL访问http/https

    Lua-cURL是一个用于在Lua环境中实现HTTP和HTTPS访问的库,它是基于著名的C语言库cURL构建的。这个库提供了全面的功能,使得Lua脚本能够方便地与Web服务进行交互,比如发送GET、POST请求,处理cookies,上传文件,...

    NDK25 API28 curl

    标题 "NDK25 API28 curl" 指涉的是使用NDK(Native Development Kit)版本25,针对Android API级别28,与curl库的集成和构建过程。curl是一个广泛使用的开源库,用于在命令行或程序中执行HTTP和其他网络协议的传输...

    编译过程中缺少的curl库文件

    5. **版本兼容性**:确保使用的`curl`库版本与你的编译环境和项目需求相匹配,不同版本的库可能包含不同的功能或API。 6. **头文件**:确保包含了`curl`库的头文件,如`#include &lt;curl/curl.h&gt;`,这提供了访问`curl...

    curl-7.17.0 for win32

    3. `include`目录:包含了头文件,供开发者在C/C++项目中调用curl库。 4. `lib`目录:包含库文件(.lib或.dll),供链接使用。 5. `docs`:文档和手册页,介绍curl的使用方法和API参考。 6. `examples`:示例代码,...

    Qt工程中使用curl进行网络请求,最小程序

    将`C:/path/to/curl/libs`替换为你的curl库实际路径。 5. **编写代码**:现在,你可以开始编写使用curl进行网络请求的代码了。以下是一个简单的示例: ```cpp #include #include &lt;curl/curl.h&gt; int main(int...

    百度翻译API接口C版

    【百度翻译API接口C版】是为开发者提供的一种在C语言环境下实现文本翻译功能的工具。这个接口使得程序员能够轻松地将翻译功能集成到他们的C程序中,为跨语言通信和本地化工作提供了便利。下面将详细介绍这个API接口...

    Curl获取网络时间.zip_Curl获取网络时间_curl 时间_curl 网络时间_网络时间 curl_网络时间获取

    curl_easy_setopt(curl, CURLOPT_URL, "http://worldtimeapi.org/api/timezone/utc"); // 设置回调函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); // 执行请求 res = curl_easy_perform...

    windows 下curl安装包下载

    使用解压缩工具(如WinRAR或7-Zip)将其解压到任意文件夹,例如"C:\Tools\curl"。为了在命令行(如cmd或PowerShell)中无需指定完整路径就能使用Curl,需要将Curl的可执行文件路径添加到系统环境变量Path中。 1. ...

    windows下的curl64位动态库

    在实际开发中,`curl` 提供了丰富的API接口,如`curl_easy_init()`初始化一个简单的会话,`curl_easy_setopt()`设置请求选项,`curl_easy_perform()`执行请求,以及`curl_easy_cleanup()`释放资源。开发人员可以根据...

    githubapicpp:GitHub Rest API V3 C ++,CURL,rapidjson实现

    【标题】"githubapicpp" 是一个C++实现的库,它利用了CURL库和rapidjson库来与GitHub的REST API V3进行交互。这个项目的主要目标是为开发者提供一个简单、高效的接口,以便在C++项目中轻松地访问和操作GitHub的API。...

    curl-7.74.0.tar.gz

    - Curl 是用 C 语言编写的,因此对性能有很高的优化。 - 它支持大量的网络协议,包括 HTTP/1.x、HTTP/2、HTTP/3、HTTPS、FTP、SFTP、TFTP、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP 等。 - Curl 支持多种认证...

    cURL的windows版本,带中文说明

    cURL在开发中常用于API测试,例如,你可以用它测试RESTful API的响应。通过传递不同的参数,模拟客户端的行为,查看服务器返回的数据。此外,cURL也用于自动化任务,例如定期抓取网页内容,或者在脚本中执行HTTP操作...

    android使用NDK编译curl库源码

    LOCAL_SRC_FILES := $(wildcard src/*.c) # 用实际的Curl源文件替换 include $(BUILD_SHARED_LIBRARY) ``` 这里,`LOCAL_CFLAGS`包含了预处理宏,`LOCAL_LDLIBS`指定了链接所需的库,`LOCAL_SRC_FILES`列出了...

Global site tag (gtag.js) - Google Analytics