久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C++使用libcurl做HttpClient

 夢醉千秋 2015-06-17
當使用C++做HTTP客戶端時,目前通用的做法就是使用libcurl,。其官方網(wǎng)站的地址是http://curl./,,該網(wǎng)站主要提供了Curl和libcurl。Curl是命令行工具,,用于完成FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP的命令的請求及接收回饋,。libcurl提供給開發(fā)者,用于使用C++跨平臺的開發(fā)各種網(wǎng)絡(luò)協(xié)議的請求及響應(yīng),。里面的文檔非常齊全,,不過都是英文的。

本文提供最簡單的demo使用libcurl開發(fā)HttpClient,。主要包括同步的HTTP GET,、HTTP POST、HTTPS GET,、HTTPS POST,。

下載libcurl包,如果使用Linux平臺,,建議下載源文件編譯,;如果使用Windows平臺,建議下載Win32 - MSVC,,下載地址是:http://curl./download.html
  1. #ifndef __HTTP_CURL_H__
  2. #define __HTTP_CURL_H__
  3. #include <string>
  4. class CHttpClient
  5. {
  6. public:
  7. CHttpClient(void);
  8. ~CHttpClient(void);
  9. public:
  10. /**
  11. * @brief HTTP POST請求
  12. * @param strUrl 輸入?yún)?shù),請求的Url地址,如:http://www.baidu.com
  13. * @param strPost 輸入?yún)?shù),使用如下格式para1=val1?2=val2&…
  14. * @param strResponse 輸出參數(shù),返回的內(nèi)容
  15. * @return 返回是否Post成功
  16. */
  17. int Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse);
  18. /**
  19. * @brief HTTP GET請求
  20. * @param strUrl 輸入?yún)?shù),請求的Url地址,如:http://www.baidu.com
  21. * @param strResponse 輸出參數(shù),返回的內(nèi)容
  22. * @return 返回是否Post成功
  23. */
  24. int Get(const std::string & strUrl, std::string & strResponse);
  25. /**
  26. * @brief HTTPS POST請求,無證書版本
  27. * @param strUrl 輸入?yún)?shù),請求的Url地址,如:https://www.alipay.com
  28. * @param strPost 輸入?yún)?shù),使用如下格式para1=val1?2=val2&…
  29. * @param strResponse 輸出參數(shù),返回的內(nèi)容
  30. * @param pCaPath 輸入?yún)?shù),為CA證書的路徑.如果輸入為NULL,則不驗證服務(wù)器端證書的有效性.
  31. * @return 返回是否Post成功
  32. */
  33. int Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath = NULL);
  34. /**
  35. * @brief HTTPS GET請求,無證書版本
  36. * @param strUrl 輸入?yún)?shù),請求的Url地址,如:https://www.alipay.com
  37. * @param strResponse 輸出參數(shù),返回的內(nèi)容
  38. * @param pCaPath 輸入?yún)?shù),為CA證書的路徑.如果輸入為NULL,則不驗證服務(wù)器端證書的有效性.
  39. * @return 返回是否Post成功
  40. */
  41. int Gets(const std::string & strUrl, std::string & strResponse, const char * pCaPath = NULL);
  42. public:
  43. void SetDebug(bool bDebug);
  44. private:
  45. bool m_bDebug;
  46. };
  47. #endif
  48. [cpp] view plaincopy
  49. #include "httpclient.h"
  50. #include "curl/curl.h"
  51. #include <string>
  52. CHttpClient::CHttpClient(void) :
  53. m_bDebug(false)
  54. {
  55. }
  56. CHttpClient::~CHttpClient(void)
  57. {
  58. }
  59. static int OnDebug(CURL *, curl_infotype itype, char * pData, size_t size, void *)
  60. {
  61. if(itype == CURLINFO_TEXT)
  62. {
  63. //printf("[TEXT]%s\n", pData);
  64. }
  65. else if(itype == CURLINFO_HEADER_IN)
  66. {
  67. printf("[HEADER_IN]%s\n", pData);
  68. }
  69. else if(itype == CURLINFO_HEADER_OUT)
  70. {
  71. printf("[HEADER_OUT]%s\n", pData);
  72. }
  73. else if(itype == CURLINFO_DATA_IN)
  74. {
  75. printf("[DATA_IN]%s\n", pData);
  76. }
  77. else if(itype == CURLINFO_DATA_OUT)
  78. {
  79. printf("[DATA_OUT]%s\n", pData);
  80. }
  81. return 0;
  82. }
  83. static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
  84. {
  85. std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);
  86. if( NULL == str || NULL == buffer )
  87. {
  88. return -1;
  89. }
  90. char* pData = (char*)buffer;
  91. str->append(pData, size * nmemb);
  92. return nmemb;
  93. }
  94. int CHttpClient::Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse)
  95. {
  96. CURLcode res;
  97. CURL* curl = curl_easy_init();
  98. if(NULL == curl)
  99. {
  100. return CURLE_FAILED_INIT;
  101. }
  102. if(m_bDebug)
  103. {
  104. curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
  105. curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
  106. }
  107. curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
  108. curl_easy_setopt(curl, CURLOPT_POST, 1);
  109. curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());
  110. curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
  111. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
  112. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
  113. curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
  114. curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
  115. curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
  116. res = curl_easy_perform(curl);
  117. curl_easy_cleanup(curl);
  118. return res;
  119. }
  120. int CHttpClient::Get(const std::string & strUrl, std::string & strResponse)
  121. {
  122. CURLcode res;
  123. CURL* curl = curl_easy_init();
  124. if(NULL == curl)
  125. {
  126. return CURLE_FAILED_INIT;
  127. }
  128. if(m_bDebug)
  129. {
  130. curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
  131. curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
  132. }
  133. <pre name="code" class="cpp"> curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
  134. curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
  135. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
  136. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
  137. /**
  138. * 當多個線程都使用超時處理的時候,,同時主線程中有sleep或是wait等操作。
  139. * 如果不設(shè)置這個選項,,libcurl將會發(fā)信號打斷這個wait從而導(dǎo)致程序退出,。
  140. */
  141. curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
  142. curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
  143. curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
  144. res = curl_easy_perform(curl);
  145. curl_easy_cleanup(curl);
  146. return res;
  147. }
  148. int CHttpClient::Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath)
  149. {
  150. CURLcode res;
  151. CURL* curl = curl_easy_init();
  152. if(NULL == curl)
  153. {
  154. return CURLE_FAILED_INIT;
  155. }
  156. if(m_bDebug)
  157. {
  158. curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
  159. curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
  160. }
  161. curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
  162. curl_easy_setopt(curl, CURLOPT_POST, 1);
  163. curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());
  164. curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
  165. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
  166. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
  167. curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
  168. if(NULL == pCaPath)
  169. {
  170. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
  171. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
  172. }
  173. else
  174. {
  175. //缺省情況就是PEM,所以無需設(shè)置,另外支持DER
  176. //curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
  177. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
  178. curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);
  179. }
  180. curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
  181. curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
  182. res = curl_easy_perform(curl);
  183. curl_easy_cleanup(curl);
  184. return res;
  185. }
  186. int CHttpClient::Gets(const std::string & strUrl, std::string & strResponse, const char * pCaPath)
  187. {
  188. CURLcode res;
  189. CURL* curl = curl_easy_init();
  190. if(NULL == curl)
  191. {
  192. return CURLE_FAILED_INIT;
  193. }
  194. if(m_bDebug)
  195. {
  196. curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
  197. curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
  198. }
  199. curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
  200. curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
  201. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
  202. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
  203. curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
  204. if(NULL == pCaPath)
  205. {
  206. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
  207. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
  208. }
  209. else
  210. {
  211. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
  212. curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);
  213. }
  214. curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
  215. curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
  216. res = curl_easy_perform(curl);
  217. curl_easy_cleanup(curl);
  218. return res;
  219. }
  220. ///////////////////////////////////////////////////////////////////////////////////////////////
  221. void CHttpClient::SetDebug(bool bDebug)
  222. {
  223. m_bDebug = bDebug;
  224. }

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多