c/c++开发中经常要用到http/https协议,直接使用socket工作量很大,要是使用socket实现https,那更不可思议,开源的c/c++的http客户端框架,libcurl是首选,而且也相当成熟稳定,最近C++项目中用到https请求,就做下研究。

libcurl简介(来源官网)

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。官网地址:https://curl.haxx.se/libcurl/

实现HTTP/GET:

Get.cpp

  1. /********************************************************
  2. Copyright (C), 2016-2018,
  3. FileName: Get
  4. Author: woniu201
  5. Email: wangpengfei.201@163.com
  6. Created: 2018/10/15
  7. Description: 实现HTTP/HTTPS GET请求
  8. ********************************************************/
  9. #include "main.h"
  10.  
  11. size_t WriteGetResp(void *buffer, size_t size, size_t nmemb, void *userp)
  12. {
  13. ((string*)userp)->append((char*)buffer, , size*nmemb);
  14. return size*nmemb;
  15. }
  16.  
  17. /************************************
  18. @ Brief: GET请求
  19. @ Author: woniu201
  20. @ Created: 2018/10/15
  21. @ Return:
  22. ************************************/
  23. int HttpGet(char* url)
  24. {
  25. string respData;
  26. CURL* curl;
  27. CURLcode res;
  28.  
  29. curl = curl_easy_init();
  30. if (curl == NULL)
  31. {
  32. return ;
  33. }
  34.  
  35. curl_easy_setopt(curl, CURLOPT_URL, url);
  36. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteGetResp);
  37. curl_easy_setopt(curl, CURLOPT_WRITEDATA, &respData);
  38.  
  39. // curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 5000); //libcurl存在毫秒超时bug,如果设备小于1000ms立即返回失败
  40. // curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 5000); //设置超时时间
  41.  
  42. bool bCA = FALSE;
  43. if (!bCA)
  44. {
  45. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);//设定为不验证证书和HOST
  46. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  47. }
  48. else
  49. {
  50. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
  51. curl_easy_setopt(curl, CURLOPT_CAINFO, "");
  52. }
  53.  
  54. res = curl_easy_perform(curl);
  55. if (res != CURLE_OK)
  56. {
  57. cout << curl_easy_strerror(res) << endl;
  58. }
  59.  
  60. curl_easy_cleanup(curl);
  61.  
  62. cout << Utf8ToAscii(respData) << endl;
  63. return ;
  64. }

实现HTTP/POST:

Post.cpp

  1. /********************************************************
  2. Copyright (C), 2016-2018,
  3. FileName: Post
  4. Author: woniu201
  5. Email: wangpengfei.201@163.com
  6. Created: 2018/10/15
  7. Description: 实现HTTP/HTTPS POST请求
  8. ********************************************************/
  9. #include "main.h"
  10.  
  11. size_t WritePostBodyResp(void *buffer, size_t size, size_t nmemb, void *userp)
  12. {
  13. ((string*)userp)->append((char*)buffer, , size*nmemb);
  14. return size*nmemb;
  15. }
  16.  
  17. size_t WritePostHeaderResp(void *buffer, size_t size, size_t nmemb, void *userp)
  18. {
  19. ((string*)userp)->append((char*)buffer, , size*nmemb);
  20. return size*nmemb;
  21. }
  22.  
  23. /************************************
  24. @ Brief: POST请求
  25. @ Author: woniu201
  26. @ Created: 2018/10/15
  27. @ Return:
  28. ************************************/
  29. int HttpPost(char* url, char* body)
  30. {
  31. string respBodyData;
  32. string respHeadData;
  33. CURL* curl;
  34. CURLcode res;
  35.  
  36. //设置头
  37. struct curl_slist *headers = NULL;
  38. headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
  39.  
  40. curl = curl_easy_init();
  41. if (curl == NULL)
  42. {
  43. return ;
  44. }
  45.  
  46. curl_easy_setopt(curl, CURLOPT_URL, url);
  47. curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body);
  48. curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  49.  
  50. curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WritePostHeaderResp);
  51. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WritePostBodyResp);
  52. curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &respHeadData);
  53. curl_easy_setopt(curl, CURLOPT_WRITEDATA, &respBodyData);
  54.  
  55. // curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 5000); //libcurl存在毫秒超时bug,如果设备小于1000ms立即返回失败
  56. // curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 5000); //设置超时时间
  57.  
  58. bool bCA = FALSE;
  59. if (!bCA)
  60. {
  61. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);//设定为不验证证书和HOST
  62. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  63. }
  64. else
  65. {
  66. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
  67. curl_easy_setopt(curl, CURLOPT_CAINFO, "");
  68. }
  69.  
  70. res = curl_easy_perform(curl);
  71. if (res != CURLE_OK)
  72. {
  73. cout << curl_easy_strerror(res) << endl;
  74. }
  75. curl_slist_free_all(headers);
  76. curl_easy_cleanup(curl);
  77.  
  78. cout << Utf8ToAscii(respHeadData) << endl;
  79. cout << Utf8ToAscii(respBodyData) << endl;
  80.  
  81. return ;
  82. }

其他代码:

  1. utils.cpp
  1. /********************************************************
  2. Copyright (C), 2016-2018,
  3. FileName: utils
  4. Author: woniu201
  5. Email: wangpengfei.201@163.com
  6. Created: 2018/10/15
  7. Description: ASSIC--UTF8互转
  8. ********************************************************/
  9. #include "main.h"
  10. #include <string>
  11. #include <Windows.h>
  12. #include <wchar.h>
  13. using namespace std;
  14.  
  15. wstring AsciiToUnicode(const string& str) {
  16. // 预算-缓冲区中宽字节的长度
  17. int unicodeLen = MultiByteToWideChar(CP_ACP, , str.c_str(), -, nullptr, );
  18. // 给指向缓冲区的指针变量分配内存
  19. wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);
  20. // 开始向缓冲区转换字节
  21. MultiByteToWideChar(CP_ACP, , str.c_str(), -, pUnicode, unicodeLen);
  22. wstring ret_str = pUnicode;
  23. free(pUnicode);
  24. return ret_str;
  25. }
  26. string UnicodeToAscii(const wstring& wstr) {
  27. // 预算-缓冲区中多字节的长度
  28. int ansiiLen = WideCharToMultiByte(CP_ACP, , wstr.c_str(), -, nullptr, , nullptr, nullptr);
  29. // 给指向缓冲区的指针变量分配内存
  30. char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);
  31. // 开始向缓冲区转换字节
  32. WideCharToMultiByte(CP_ACP, , wstr.c_str(), -, pAssii, ansiiLen, nullptr, nullptr);
  33. string ret_str = pAssii;
  34. free(pAssii);
  35. return ret_str;
  36. }
  37.  
  38. wstring Utf8ToUnicode(const string& str) {
  39. // 预算-缓冲区中宽字节的长度
  40. int unicodeLen = MultiByteToWideChar(CP_UTF8, , str.c_str(), -, nullptr, );
  41. // 给指向缓冲区的指针变量分配内存
  42. wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);
  43. // 开始向缓冲区转换字节
  44. MultiByteToWideChar(CP_UTF8, , str.c_str(), -, pUnicode, unicodeLen);
  45. wstring ret_str = pUnicode;
  46. free(pUnicode);
  47. return ret_str;
  48. }
  49. string UnicodeToUtf8(const wstring& wstr) {
  50. // 预算-缓冲区中多字节的长度
  51. int ansiiLen = WideCharToMultiByte(CP_UTF8, , wstr.c_str(), -, nullptr, , nullptr, nullptr);
  52. // 给指向缓冲区的指针变量分配内存
  53. char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);
  54. // 开始向缓冲区转换字节
  55. WideCharToMultiByte(CP_UTF8, , wstr.c_str(), -, pAssii, ansiiLen, nullptr, nullptr);
  56. string ret_str = pAssii;
  57. free(pAssii);
  58. return ret_str;
  59. }
  60.  
  61. /************************************
  62. @ Brief: ASSIC转UTF8
  63. @ Author: woniu201
  64. @ Created: 2018/10/16
  65. @ Return:
  66. ************************************/
  67. string AsciiToUtf8(const string& str) {
  68. return UnicodeToUtf8(AsciiToUnicode(str));
  69. }
  70.  
  71. /************************************
  72. @ Brief: UTF8转ASSIC
  73. @ Author: woniu201
  74. @ Created: 2018/10/16
  75. @ Return:
  76. ************************************/
  77. string Utf8ToAscii(const string& str) {
  78. return UnicodeToAscii(Utf8ToUnicode(str));
  79. }
  1. #ifndef _MAIN_H
  2. #define _MAIN_H
  3.  
  4. #include <iostream>
  5. #include <string>
  6. #include "include/curl.h"
  7.  
  8. using namespace std;
  9.  
  10. #pragma comment(lib, "ssleay32.lib")
  11. #pragma comment(lib, "libcurl.lib")
  12.  
  13. string AsciiToUtf8(const string& str);
  14. string Utf8ToAscii(const string& str);
  15.  
  16. int HttpGet(char* url);
  17. int HttpPost(char* url, char* body);
  18. int HttpDownload(char* url, char* filePath);
  19. #endif

对应libcurl库和头文件下载地址(支持HTTPS):点击下载

扫码关注公众号

专注分享C/C++,C++(11,14,17),STL,Java,Spring,mybatis,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,还有高薪互联网职位内推,在这里一起探讨,一起学习,一起进步,同时不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

基于libcurl实现REST风格http/https的get和post的更多相关文章

  1. 基于MVC的RESTful风格的实现

    基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...

  2. C++服务器开发之基于对象的编程风格

    Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include <pthread.h> #include <boost/functio ...

  3. [解读REST] 4.基于网络应用的架构风格

    上篇文章介绍了一组自洽的术语来描述和解释软件架构:如何利用架构属性评估一个架构风格:以及对于基于网络的应用架构来说,那些架构属性是值得我们重点关注评估的.本篇在以上的基础上,列举一下一些常见的(RES ...

  4. 基于MVC的RESTFul风格API实战

    基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...

  5. 基于阿里云上实现全站https的正确姿势(一)

    对应的网址:https://yq.aliyun.com/articles/65199 摘要: 目前主流大厂的网站和服务都已经实现了全站https, 例如: baidu, taobao, jd等. 关于 ...

  6. 基于libcurl的restfull接口 post posts get gets

    头文件 #pragma once #ifndef __HTTP_CURL_H__ #define __HTTP_CURL_H__ #include <string> #include &q ...

  7. 基于Nginx服务器和iOS9的HTTPS安全通信

    简介 在网络通信中,使用抓包软件可以对网络请求进行分析,并进行重放攻击,重放攻击的解决方案一般是使用一个变化的参数,例如RSA加密的时间戳,但考虑到网络传输时延,时间戳需要有一定的误差容限,这样仍然不 ...

  8. restfull 风格 参考 https://blog.csdn.net/jaryle/article/details/52141097

    https://www.cnblogs.com/xiaoxian1369/p/4332390.html :

  9. Prometheus基于consul自动发现监控对象 https://www.iloxp.com/archive/11/

      Prometheus 监控目标为什么要自动发现 频繁对Prometheus配置文件进行修改,无疑给运维人员带来很大的负担,还有可能直接变成一个“配置小王子”,即使是配置小王子也会存在人为失误的情况 ...

随机推荐

  1. solr特点七:Plugins(扩展点)

    http://wiki.apache.org/solr/SolrPlugins 在 Solr 1.3 中,扩展 Solr 以及配置和重新整理扩展变得十分简单.以前,您需要编写一个 SolrReques ...

  2. CVE-2018-7600 Drupal核心远程代码执行漏洞分析

    0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...

  3. 关于Office软件中Word输入时卡顿无反应的解决办法!

    最近在安装office2013时遇到了这样一个问题,就是在激活office之后,打开Word输入内容时十分卡顿.也是狂搜网上各种办法,有说改注册表的,也有说在office选项里设置什么输入法的,全试了 ...

  4. .netcore Swagger 生成 api接口文档

    1, 引用第三方包, Swashbuckle.AspNetCore Swashbuckle.AspNetCore.Swagger Swashbuckle.AspNetCore.SwaggerUI 最简 ...

  5. Sql语法高级应用之五:使用存储过程实现对明细多层次统计

    前言 前面章节我们讲到了存储过程的基础用法,本章则将一个在项目中实际应用的场景. 在项目中经常会存在这样的需求,例如需要对明细列表进行按组.按级别.按人等进行统计,如果在附带列表的查询条件,又如何实现 ...

  6. ASP.NET WebApi总结之自定义权限验证

    在.NET中有两个AuthorizeAttribute类, 一个定义在System.Web.Http命名空间下 #region 程序集 System.Web.Http, Version=5.2.3.0 ...

  7. Gogland使用 - 非常简单查看Go语言源代码全貌!

    Go语言也支持面向对象开发,不过和以往我们所使用的面向对象开发还是有不同,Go语言主张组合方式形成类的概念,在Go语言中,结构起到很大作用,如果用结构组合字段和方法,那么单纯在源代码中看,真的是费时费 ...

  8. Java50道经典习题-程序17 猴子吃桃问题

    题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只 ...

  9. Java中 IO类 - File类中的判断功能

    package com.hxzy.IOSer;import java.io.*;public class Demo05 { public static void main(String[] args) ...

  10. IIS7的网站通过https访问提示ssl_error_rx_record_too_long

    IIS7的网站通过https访问,提示ssl_error_rx_record_too_long,如下图所示: 解决办法: 一.导入服务器的SSL证书至IIS 1.打开IIS,找到服务器证书 2.导入本 ...