下载编译libcurl

  1. 下载curl源码,找到vs工程,按照x86 x64 并对应debugrelease编译出静态库lib

构建工程

  • curl头文件和lib拷贝到工程目录
  • 配置附加包含目录libcurl中的include和附加库目录libcurl中的lib目录
  • 添加预编译宏USE_OPENSSL和CURL_STATICLIB
  • 添加如依赖库 crypt32.lib,ws2_32.lib,wldap32.lib,libcurl.lib

代码示例

#include <iostream>  
#include <string>  
#include "curl/curl.h"  
using namespace std;  

#pragma comment(lib, "ws2_32.lib")  
#pragma comment(lib, "wldap32.lib")  
#pragma comment(lib, "libcurl.lib")  

// reply of the requery  
size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream)  
{  
    cout << "----->reply" << endl;  
    string *str = (string*)stream;  
    cout << *str << endl;  
    (*str).append((char*)ptr, size*nmemb);  
    return size * nmemb;  
}  

// http GET  
CURLcode curl_get_req(const std::string &url, std::string &response)  
{  
    // init curl  
    CURL *curl = curl_easy_init();  
    // res code  
    CURLcode res;  
    if (curl)  
    {  
        // set params  
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // url  
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); // if want to use https  
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); // set peer and host verify false  
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);  
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);  
        curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
        curl_easy_setopt(curl, CURLOPT_HEADER, 1);  
        curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // set transport and time out time  
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);  
        // start req  
        res = curl_easy_perform(curl);  
    }  
    // release curl  
    curl_easy_cleanup(curl);  
    return res;  
}  

// http POST  
CURLcode curl_post_req(const string &url, const string &postParams, string &response)  
{  
    // init curl  
    CURL *curl = curl_easy_init();  
    // res code  
    CURLcode res;  
    if (curl)  
    {  
        // set params  
        curl_easy_setopt(curl, CURLOPT_POST, 1); // post req  
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // url  
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postParams.c_str()); // params  
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); // if want to use https  
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); // set peer and host verify false  
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);  
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);  
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);  
        curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
        curl_easy_setopt(curl, CURLOPT_HEADER, 1);  
        curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);  
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);  
        // start req  
        res = curl_easy_perform(curl);  
    }  
    // release curl  
    curl_easy_cleanup(curl);  
    return res;  
}  

int main()  
{  
    // global init  
    curl_global_init(CURL_GLOBAL_ALL);  

    // test get requery  
    string getUrlStr = "http://cn.bing.com/images/trending?form=Z9LH";  
    string getResponseStr;  
    auto res = curl_get_req(getUrlStr, getResponseStr);  
    if (res != CURLE_OK)  
        cerr << "curl_easy_perform() failed: " + string(curl_easy_strerror(res)) << endl;  
    else  
        cout << getResponseStr << endl;  

    // test post requery  
    string postUrlStr = "https://www.baidu.com/s";  
    string postParams = "f=8&rsv_bp=1&rsv_idx=1&word=picture&tn=98633779_hao_pg";  
    string postResponseStr;  
    auto res = curl_post_req(postUrlStr, postParams, postResponseStr);  
    if (res != CURLE_OK)  
        cerr << "curl_easy_perform() failed: " + string(curl_easy_strerror(res)) << endl;  
    else  
        cout << postResponseStr << endl;  

    // global release  
    curl_global_cleanup();  
    system("pause");  
    return 0;  
}
  • get和post可以用于请求html信息,也可以请求xml和json等串
  • 可以添加自定义的header 域和cookies
  • 这是libcurl的简单接口,基本等同于阻塞试请求,libcurl有高阶的异步并发接口,运用更复杂

image.jpeg