昨天晚上锻炼身体,好久没激烈与动了,爽快!回到家,赶紧把之前写好的curl组件分享出来,EasyCurl其实就是对libcurl的一个封装,libcurl如果没用过的可以百度之。
curl其实很简单理解,socket大家都用过,其实http请求也是个socket短链接,只是通信的字段会按着HTTP字段来组包,而且都是明文的。比如在浏览器里输入www.baidu.com,就能开间回来的html代码和html code等信息,其实这就是一次curl的过程。linux命令行就有一个curl的shell命令,通过curl -v url就可以看出curl的作用。
libcurl就是curl的一个库,可以发送http请求(ftp/cookies等都支持) 功能比较全了,EasyCurl只是在它之上用c++提供了一些比较人性化的借口(不必在纠结curl_set_option之类的)。EasyCurl不是用libcurl的默认输出方法(libcurl默认把网页返回的content打印到stdout),而是会让用户传入一个buffer,在执行完curl动作后,用户的缓冲区会被写入数据。EasyCurl还支持用会传入一个回调函数,来制定如何处理curl拿到的数据,这两者只能用其中一个方法。
libcurl的接口如下
namespace ubplus { class EasyCurl { // ..... } }
设置要访问的url :
/** * @brief : curl_set_opt(CURLOPT_URL) * * @param : [in] url , url string * * @return : if CURL* not vaild , get_error() will set */ int set_url(std::string url);
/** * @brief : give curl a callback which is called * when fetched data is ready to copy * * @param : function pointer */ int set_curl_callback(CURL_CALLBACK);
/** * @brief : pass to callback lastest param * * @param : function pointer */ int set_curl_callback_context(void*);
/** * @brief : set user's buffer , if we do fetch() then we * write the content to buffer if user set their * own callback , this buffer will ignore * * @param : [out] user buffer * [in] buffer length * * @return : if buffer is invaild , get_error() will set */ int set_user_buffer(char** buf,size_t len);
/** * @brief : curl_set_opt(CURLOPT_TIMEOUT) * * @param : [in] timeout , time in seconds * * @return : if CURL* not vaild , get_error() will set */ int set_timeout(unsigned long time);
/** * @brief : enable post method and set post data * * @param : [in] post , post data * * @return : if CURL* not vaild , get_error() will set */ int set_post_data(void* post);
/** * @brief : do curl action * * @return : curl ok or not , get_error() will set */ int fetch();