对curl的封装

http.h

#ifndef _HTTP_H_
#define _HTTP_H_

#include <string>
#include <set>
#include <curl/curl.h>

namespace tools
{

class CCurlWrapper
{
public:
    CCurlWrapper ();
    ~CCurlWrapper ();

    int PostFile (const std::string& strUrl, const std::string& strRequest, std::string& strReply);
    int GetFile (const std::string& strUrl, std::string& strReply);
    void AddHttpHeader (const std::string& strHeader);

private:
    int Init ();
    static size_t WriteDataCallback (void *ptr, size_t size, size_t nCount, void *pData);

    CURL *m_pCurl;
    std::set<std::string> m_setHeaders;

};

}

#endif

http.cpp

#include "http.h"
#include <sstream>

using namespace std;
using namespace tools;

CCurlWrapper::CCurlWrapper () :
    m_pCurl(NULL)
{
    //curl_global_init(CURL_GLOBAL_ALL);
    Init();
}

CCurlWrapper::~CCurlWrapper ()
{
    curl_easy_cleanup(m_pCurl);
    m_pCurl = NULL;
}

int CCurlWrapper::Init ()
{
    if (m_pCurl)
    {
        curl_easy_cleanup(m_pCurl);
        m_pCurl = NULL;
    }

    m_pCurl = curl_easy_init();
    if (m_pCurl == NULL)
    {
        return -1;
    }

    // set connection timeout to 10's
    curl_easy_setopt(m_pCurl, CURLOPT_CONNECTTIMEOUT, 10);

    // set timeout to 30's
    curl_easy_setopt(m_pCurl, CURLOPT_TIMEOUT, 30);

    // accept identiy, deflate, and gzip encoding. (Accept-Encoding: )
    curl_easy_setopt(m_pCurl, CURLOPT_ENCODING, "gzip, deflate");

    // set user-agent to that of MSIE6
    curl_easy_setopt(m_pCurl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");

    // let curl to follow location (auto handle HTTP 301, 302)
    curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1);

    m_setHeaders.clear();
    m_setHeaders.insert("Accept-Language: zh-cn");

    // output debug info (for debug only)
    //curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, true);
    curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, false);

    return 0;
}

void CCurlWrapper::AddHttpHeader (const string& strHeader)
{
    m_setHeaders.insert(strHeader);
}

int CCurlWrapper::PostFile (const string& strUrl, const string& strRequest, string& strReply)
{
    if (m_pCurl == NULL)
        return -1;

    int iRet;
    if (strUrl.empty())
    {
        return -2;
    }

    curl_easy_setopt(m_pCurl, CURLOPT_URL, strUrl.c_str());
    stringstream ssReply;
    curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, &ssReply);
    curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, WriteDataCallback);

    // set post data
    if (strRequest.empty())
    {
        return -3;
    }
    curl_easy_setopt(m_pCurl, CURLOPT_POST, true);
    curl_easy_setopt(m_pCurl, CURLOPT_POSTFIELDS, strRequest.c_str());
    curl_easy_setopt(m_pCurl, CURLOPT_POSTFIELDSIZE, strRequest.length());

    // autosave cookie with the handle
    curl_easy_setopt(m_pCurl, CURLOPT_COOKIEFILE, "/dev/null");

    // set header
    struct curl_slist *headers = NULL;
    if (!m_setHeaders.empty())
    {
        for (set<string>::iterator it = m_setHeaders.begin(); it != m_setHeaders.end(); ++it)
            headers = curl_slist_append(headers, it->c_str());
    }
    curl_easy_setopt(m_pCurl, CURLOPT_HTTPHEADER, headers);

    curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, 0L);

    //curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, &ssReply);
    //curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, WriteDataCallback);

    // perform
    iRet = curl_easy_perform(m_pCurl);
    if (iRet == CURLE_OK)
    {
        strReply = ssReply.str();
    }

    if (headers)
        curl_slist_free_all(headers);

    return (iRet == CURLE_OK) ? 0 : iRet;
}

int CCurlWrapper::GetFile (const string& strUrl, string& strReply)
{
    if (m_pCurl == NULL)
        return -1;

    int iRet;
    if (strUrl.empty())
    {
        return -2;
    }

    curl_easy_setopt(m_pCurl, CURLOPT_URL, strUrl.c_str());
    stringstream ssReply;
    curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, &ssReply);
    curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, WriteDataCallback);

    curl_easy_setopt(m_pCurl, CURLOPT_HTTPGET, true);

    // autosave cookie with the handle
    curl_easy_setopt(m_pCurl, CURLOPT_COOKIEFILE, "/dev/null");

    // set header
    struct curl_slist *headers = NULL;
    if (!m_setHeaders.empty())
    {
        for (set<string>::iterator it = m_setHeaders.begin(); it != m_setHeaders.end(); ++it)
            headers = curl_slist_append(headers, it->c_str());
    }
    curl_easy_setopt(m_pCurl, CURLOPT_HTTPHEADER, headers);

    curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, 0L);

    //curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, &ssReply);
    //curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, WriteDataCallback);

    // perform
    iRet = curl_easy_perform(m_pCurl);
    if (iRet == CURLE_OK)
    {
        strReply = ssReply.str();
    }

    if (headers)
        curl_slist_free_all(headers);

    return (iRet == CURLE_OK) ? 0 : iRet;
}

size_t CCurlWrapper::WriteDataCallback (void *ptr, size_t size, size_t nCount, void *pData)
{
    stringstream* pTmp = (stringstream*) pData;
    pTmp->write((char*) ptr, size * nCount);
    return size * nCount;
}
时间: 2024-10-05 06:36:15

对curl的封装的相关文章

php curl函数封装

<?php     /*cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特性,以及在PHP中如何运用它.     封装php curl 直接可以使用 */ function curl_post ($url, $postfields = '', $headers = '', $timeout = 20, $file = 0){         $ch = curl_init();

curl的封装

首先要搭建一个httpserver,这里採用tomcat6为例: 过程:新建一个Servlet,并使用tomcat的默认port号8080监听,最后写一个jsp来測试能否够訪问该server 1)新建一个Serlvet 新建完后增加写下測试代码: public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * Default constructor. */

curl类封装

<?php /**   * @author askwei **/   class CURL   {      private $ch;      private $url = "http://www.baidu.com";     private $flag_if_have_run;   //标记exec是否已经运行     private $set_time_out = 20;  //设置curl超时时间     private $cookie_file = "&qu

cocos2dx 3.3rc0 踩坑日记(一)------ 弱联网 Curl

这两天看了视频学习了下弱联网技术,用的是Curl,具体使用方法我就多说了,可以参考官方样例和下面的文章,解释的很清楚. [Curl (libcurl) 开发 之一]Cocos2dx之libcurl(curl_easy)的编程教程(帮助手册)! CURL使用2 我要说的我又踩到一个坑...为什么是又呢...天生就是来踩坑的... 先说下使用之前需要加入curl.h的路径$(EngineRoot)external\curl\include\win32和链接库libcurl_imp.lib 如图所示:

file_get_contents无法请求https连接的解决方法 php开启curl

file_get_contents无法请求https连接的解决方法 方法1: PHP.ini默认配置下,用file_get_contents读取https的链接,就会如下错误: Warning: fopen() [function.fopen]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? 解决方案有3:1.windows下的PHP,只需要到php.i

PHP ElasticSearch的使用

系统是Windows server 2003. ElasticSearch是一个基于Lucene的稳定的.分布式.RESTFul的搜索引擎.其实所谓的RestFul就是它提供URL供你调用(建立索引和进行检索),不过直接这样使用实在是太凶残了.所以,它也提供了一系列client包,相当于将curl请求封装了,client包支持的语言包括Java.PHP.Python.Ruby和Perl等等. PHP版的client包叫做elasticsearch-php,可以在Git_hub上下载.地址如下:h

[原创]cocos2dx加载网络图片&amp;异步加载图片

[动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到一张图片渐进(由模糊变清晰)的显示,如果在游戏中,诸如像显示高清卡牌的时候,使用有这种方式去显示一张图片,这样的体验应该会稍微好些 [相关知识] png interlaced:png图片在导出的时候是可以选择 interlaced (Adam7)的,这样的存储的png在网页上显示会渐进显示, 这种i

解决file_get_contents无法请求https连接的方法

PHP.ini默认配置下,用file_get_contents读取https的链接,就会报如下错误,本文给出解决方法 错误: Warning: fopen() [function.fopen]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? 解决方案有3: 1.windows下的PHP,只需要到php.ini中把extension=php_openssl

cocos2dx获取网络时间(一)

今天在公司的cocos2dx项目中遇到一个需求,需要获取网络时间和系统时间对比,目的是防止用户更改系统时间进行某些非法操作 . 那么cocos2dx怎么来获取网络时间呢 ?我整理的思路如下: (1)由一个web api可以返回当前的网络时间 (2)cocos2dx通过http请求该api获取数据到本地 (3)cocos2dx解析数据得到当前的网络时间 一:首先就需要一个web接口来提供网络时间的数据,我在这里自己搭建一个WCF服务返回需要的数据. 新建WCF服务应用程序 , 项目命名为NetTi