unix网络编程之开源库libcurl的简单封装使用

这里我使用django搭建了简单的http web服务器,具体步骤百度一大堆!去libcurl官网下载最新的开源库就行。
1. LibcurlHttpResquest.hpp
//
//  LibcurlHttpResquest.hpp
//  HttpClient
//
//  Created by LiYong on 2018/1/25.
//

#ifndef LibcurlHttpResquest_hpp
#define LibcurlHttpResquest_hpp

#include <stdio.h>
#include <curl/curl.h>
#include <iostream>
using namespace std;
struct WriteThis{
    const char *readptr;
    long sizeleft;
};
class LibcurlHttpResquest
{
public:
    LibcurlHttpResquest();
    ~LibcurlHttpResquest();
    static LibcurlHttpResquest *getInstance();
public:
    /******'GET'方式请求******/
    //1.将接收到得数据存到本地
    void httpGetSaveLocation(string url);
    //2.将接收到的数据作为string返回
    string httpGetReturnString(string url);

    /*****'POST'方式请求*****/
    //1.默认read function方式
    void httpPostDefault(string url,string data);
    //2.使用定制read function
    void httpPostCustom(string url,string data);

    /***custom function***/
    static size_t readData(void *buffer,size_t size,size_t nmemb,void *usedata);
    static size_t OnWriteData(void *buffer,size_t size,size_t nmemb,void *usedata);

};
#endif /* LibcurlHttpResquest_hpp */
2. LibcurlHttpResquest.cpp
//
//  LibcurlHttpResquest.cpp
//  HttpClient
//
//  Created by LiYong on 2018/1/25.
//

#include "LibcurlHttpResquest.hpp"
LibcurlHttpResquest::LibcurlHttpResquest()
{

}
LibcurlHttpResquest::~LibcurlHttpResquest()
{

}
LibcurlHttpResquest *LibcurlHttpResquest::getInstance()
{
    LibcurlHttpResquest *http = new LibcurlHttpResquest();
    if (http)
    {
        return http;
    }
    return nullptr;
}
//'GET'方式
void LibcurlHttpResquest::httpGetSaveLocation(string url)
{
    string body;
    string heady;
    CURL *curl;
    CURLcode res;
    FILE *file = fopen("./resp.html", "wb");

    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Accept:Agent-000");
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER,headers);
        curl_easy_setopt(curl, CURLOPT_URL,url.c_str());
        curl_easy_setopt(curl, CURLOPT_READFUNCTION,LibcurlHttpResquest::readData);
        curl_easy_setopt(curl, CURLOPT_HEADERDATA,file);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,LibcurlHttpResquest::OnWriteData);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA,file);
        curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING,"gzip");
        res = curl_easy_perform(curl);
        if (res != 0)
        {
            curl_slist_free_all(headers);
        }
    }
    fclose(file);
    curl_easy_cleanup(curl);
}
string LibcurlHttpResquest::httpGetReturnString(string url)
{
    string body;
    string heady;
    CURL *curl;
    CURLcode res;

    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Accept:Agent-000");
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER,headers);
        curl_easy_setopt(curl, CURLOPT_URL,url.c_str());
        curl_easy_setopt(curl, CURLOPT_READFUNCTION,LibcurlHttpResquest::readData);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,LibcurlHttpResquest::OnWriteData);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void *)&body);
        curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING,"gzip");
        res = curl_easy_perform(curl);
        if (res != 0)
        {
            curl_slist_free_all(headers);
        }
    }
    curl_easy_cleanup(curl);
    return body;
}
//'POST'方式
void LibcurlHttpResquest::httpPostDefault(string url,string data)
{
    string resp_data;

    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL,url.c_str());
        curl_easy_setopt(curl, CURLOPT_POST,1);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,LibcurlHttpResquest::OnWriteData);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void *)&resp_data);
        curl_easy_setopt(curl, CURLOPT_READDATA,LibcurlHttpResquest::readData);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS,data.c_str());
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE,strlen(data.c_str()));
        curl_easy_setopt(curl, CURLOPT_TIMEOUT,1);
        res = curl_easy_perform(curl);
    }
    if (res == 0)
    {
        cout << "resp empty" << endl;
    }
    curl_easy_cleanup(curl);
}
void LibcurlHttpResquest::httpPostCustom(string url, string data)
{
    string resp_data;
    struct WriteThis pooh;
    pooh.readptr = data.c_str();
    pooh.sizeleft = (long)strlen(data.c_str());
    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL,url.c_str());
        curl_easy_setopt(curl, CURLOPT_POST,1);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,OnWriteData);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void *)&resp_data);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,readData);

        curl_easy_setopt(curl, CURLOPT_READDATA,&pooh);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE,pooh.sizeleft);

        res = curl_easy_perform(curl);
    }
    curl_easy_cleanup(curl);
}
size_t LibcurlHttpResquest::OnWriteData(void *buffer, size_t size, size_t nmemb, void *usedata)
{
    string *str = dynamic_cast<string *>((string *)usedata);
    if (NULL == str || NULL == buffer)
    {
        return -1;
    }
    char *pData = (char *)buffer;
    str->append(pData,size * nmemb);
    return nmemb;
}
size_t LibcurlHttpResquest::readData(void *buffer, size_t size, size_t nmemb, void *usedata)
{
    struct WriteThis *data = (struct WriteThis *)usedata;
    if (data == NULL)
    {
        return -1;
    }
    if (size * nmemb < 1)
    {
        return 0;
    }
    if (data->sizeleft)
    {
        *(char *)buffer = data->readptr[0];
        data->readptr++;
        data->sizeleft--;
        return 1;
    }
    return 0;
}
//coustom function
3. main.cpp
//
//  main.cpp
//  HttpClient
//
//  Created by LiYong on 2018/1/23.
//

#include <iostream>
#include "LibcurlHttpResquest.hpp"
int main()
{
    string url = "192.168.0.83:8000";
    string data = "Hello http server !";
    LibcurlHttpResquest *http = LibcurlHttpResquest::getInstance();

    string body = http->httpGetReturnString(url);
    if (body != "")
    {
        cout << body <<endl;
    }
    http->httpPostCustom(url, data);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值