libcurlのHTTPクライアント例

6560 ワード

ヘッダファイル
#pragma once

#include <map>
#include <string>

#include <curl/curl.h>

/*
    :vs2010SP1、Win7 32bits
    :
[1]   libcurl  
CURL *curl;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
[2]  libcurl  
curl_easy_cleanup(curl);
curl_global_cleanup();
*/

namespace kagula
{
	CURLcode ReponseFromUrlByGetMethod(CURL * easy_handle, std::string url, std::string proxyAddress, int proxyType, std::string &outDataHeader, std::string &outData);
	//postData  ,"param1=value1¶m2=value2¶m3=value3"
	CURLcode ReponseFromUrlByPostMethod(CURL *curl_handle, std::string url,std::string postData, std::string &outDataHeader,std::string &outData);

	std::string GetCookieValue(std::string key);
	void GetAllCookie(std::map<std::string,std::string> &mapValue);
}
ソースファイル
#include "curl736.h"
#include <list>
#include <vector>

namespace kagula
{
	/************************************************************************/
	/* http://curl.haxx.se/                                                 */
	/************************************************************************/
	const std::string g_strAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8";
	const std::string g_strCookie = "cookie.txt";
	const int g_timeout = 3;
	std::list<std::string> g_listCookie;


	size_t write_callback( void *ptr, size_t size, size_t nmemb, void *outBuffer )
	{
		int len = size * nmemb;
		char *temp = new char[len+1];	
		memcpy(temp,ptr,len);
		temp[len]=0;
		reinterpret_cast<std::string *>(outBuffer)->append(temp);
		delete temp;
		return len;
	}

	void print_cookies(CURL *curl)
	{
		CURLcode res;
		struct curl_slist *cookies;
		struct curl_slist *nc;
		int i;

		//printf("Cookies, curl knows:
"); res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies); if (res != CURLE_OK) { fprintf(stderr, "Curl curl_easy_getinfo failed: %s
", curl_easy_strerror(res)); exit(1); } nc = cookies, i = 1; while (nc) { //printf("[%d]: %s
", i, nc->data); //kagula.begin std::string record = nc->data; g_listCookie.push_back(record); //kagula.end nc = nc->next; i++; } if (i == 1) { //printf("(none)
"); } curl_slist_free_all(cookies); } CURLcode ReponseFromUrlByGetMethod(CURL * easy_handle, std::string url, std::string proxyAddress, int proxyType, std::string &outDataHeader, std::string &outData) { // easy handle curl_easy_setopt(easy_handle, CURLOPT_USERAGENT,g_strAgent.c_str()); curl_easy_setopt(easy_handle, CURLOPT_FOLLOWLOCATION,TRUE); curl_easy_setopt(easy_handle, CURLOPT_URL, url.c_str()); curl_easy_setopt(easy_handle, CURLOPT_TIMEOUT,g_timeout); curl_easy_setopt(easy_handle, CURLOPT_VERBOSE,1); // , curl_easy_setopt(easy_handle, CURLOPT_POST,0); curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(easy_handle, CURLOPT_WRITEHEADER, &outDataHeader); curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &outData); curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE,g_strCookie.c_str()); curl_easy_setopt(easy_handle, CURLOPT_COOKIEJAR, g_strCookie.c_str()); //libcurl7.36+openssl-0.9.8k_WIN32,For https protocol support! curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYPEER, FALSE); curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYHOST, 1); //no longer support! if (proxyAddress.empty()==false) { curl_easy_setopt(easy_handle, CURLOPT_PROXY, proxyAddress.c_str());//"proxy-host.com:8080" curl_easy_setopt(easy_handle, CURLOPT_PROXYTYPE, proxyType);// 0, HTTP 。CURLPROXY_SOCKS4。 curl_easy_setopt(easy_handle, CURLOPT_HTTPPROXYTUNNEL, 1L); } CURLcode code = curl_easy_perform(easy_handle); //print_cookies(easy_handle); return code; } CURLcode ReponseFromUrlByPostMethod(CURL *curl_handle, std::string url,std::string postData, std::string &outDataHeader,std::string &outData) { curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, true); curl_easy_setopt(curl_handle, CURLOPT_USERAGENT,g_strAgent.c_str()); curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT,g_timeout); curl_easy_setopt(curl_handle, CURLOPT_VERBOSE,1); curl_easy_setopt(curl_handle, CURLOPT_POST,1); curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS,postData.c_str()); curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE,postData.size()); curl_easy_setopt(curl_handle, CURLOPT_COOKIEJAR, g_strCookie.c_str()); curl_easy_setopt(curl_handle, CURLOPT_COOKIEFILE, g_strCookie.c_str()); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, &outDataHeader); curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &outData); CURLcode code = curl_easy_perform(curl_handle); g_listCookie.clear(); print_cookies(curl_handle); return code; } std::string GetCookieValue(std::string key) { std::list<std::string>::iterator iter = g_listCookie.begin(); while( iter != g_listCookie.end() ) { int nPos = iter->find(key); if (nPos>0) { std::string data = iter->substr(nPos+key.size(),iter->size() -nPos - key.size()); std::string trimstring = "\t"; data.erase(data.find_last_not_of(trimstring)+1); data.erase(0,data.find_first_not_of(trimstring)); return data; }//end if iter++; }//end while return std::string(); }//end func void splitStr(std::string& s, std::string& delim,std::vector< std::string > &ret) { size_t last = 0; size_t index=s.find_first_of(delim,last); while (index!=std::string::npos) { ret.push_back(s.substr(last,index-last)); last=index+1; index=s.find_first_of(delim,last); if (index-last>0) { ret.push_back(s.substr(last,index-last)); } } }//end func void GetAllCookie(std::map<std::string,std::string> &mapValue) { std::list<std::string>::iterator iter = g_listCookie.begin(); while( iter != g_listCookie.end() ) { std::vector<std::string> vec; splitStr(*iter,std::string("\t"),vec); if (vec.size()<12) { continue; }//end if mapValue[vec[10]]=vec[11]; iter++; }//end while }//end func }//end namespace