基于libcurl实现REST风格http/https的get和post
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
- /********************************************************
- Copyright (C), 2016-2018,
- FileName: Get
- Author: woniu201
- Email: wangpengfei.201@163.com
- Created: 2018/10/15
- Description: 实现HTTP/HTTPS GET请求
- ********************************************************/
- #include "main.h"
- size_t WriteGetResp(void *buffer, size_t size, size_t nmemb, void *userp)
- {
- ((string*)userp)->append((char*)buffer, , size*nmemb);
- return size*nmemb;
- }
- /************************************
- @ Brief: GET请求
- @ Author: woniu201
- @ Created: 2018/10/15
- @ Return:
- ************************************/
- int HttpGet(char* url)
- {
- string respData;
- CURL* curl;
- CURLcode res;
- curl = curl_easy_init();
- if (curl == NULL)
- {
- return ;
- }
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteGetResp);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &respData);
- // curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 5000); //libcurl存在毫秒超时bug,如果设备小于1000ms立即返回失败
- // curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 5000); //设置超时时间
- bool bCA = FALSE;
- if (!bCA)
- {
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);//设定为不验证证书和HOST
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
- }
- else
- {
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
- curl_easy_setopt(curl, CURLOPT_CAINFO, "");
- }
- res = curl_easy_perform(curl);
- if (res != CURLE_OK)
- {
- cout << curl_easy_strerror(res) << endl;
- }
- curl_easy_cleanup(curl);
- cout << Utf8ToAscii(respData) << endl;
- return ;
- }
实现HTTP/POST:
Post.cpp
- /********************************************************
- Copyright (C), 2016-2018,
- FileName: Post
- Author: woniu201
- Email: wangpengfei.201@163.com
- Created: 2018/10/15
- Description: 实现HTTP/HTTPS POST请求
- ********************************************************/
- #include "main.h"
- size_t WritePostBodyResp(void *buffer, size_t size, size_t nmemb, void *userp)
- {
- ((string*)userp)->append((char*)buffer, , size*nmemb);
- return size*nmemb;
- }
- size_t WritePostHeaderResp(void *buffer, size_t size, size_t nmemb, void *userp)
- {
- ((string*)userp)->append((char*)buffer, , size*nmemb);
- return size*nmemb;
- }
- /************************************
- @ Brief: POST请求
- @ Author: woniu201
- @ Created: 2018/10/15
- @ Return:
- ************************************/
- int HttpPost(char* url, char* body)
- {
- string respBodyData;
- string respHeadData;
- CURL* curl;
- CURLcode res;
- //设置头
- struct curl_slist *headers = NULL;
- headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
- curl = curl_easy_init();
- if (curl == NULL)
- {
- return ;
- }
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body);
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
- curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WritePostHeaderResp);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WritePostBodyResp);
- curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &respHeadData);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &respBodyData);
- // curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 5000); //libcurl存在毫秒超时bug,如果设备小于1000ms立即返回失败
- // curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 5000); //设置超时时间
- bool bCA = FALSE;
- if (!bCA)
- {
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);//设定为不验证证书和HOST
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
- }
- else
- {
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
- curl_easy_setopt(curl, CURLOPT_CAINFO, "");
- }
- res = curl_easy_perform(curl);
- if (res != CURLE_OK)
- {
- cout << curl_easy_strerror(res) << endl;
- }
- curl_slist_free_all(headers);
- curl_easy_cleanup(curl);
- cout << Utf8ToAscii(respHeadData) << endl;
- cout << Utf8ToAscii(respBodyData) << endl;
- return ;
- }
其他代码:
- utils.cpp
- /********************************************************
- Copyright (C), 2016-2018,
- FileName: utils
- Author: woniu201
- Email: wangpengfei.201@163.com
- Created: 2018/10/15
- Description: ASSIC--UTF8互转
- ********************************************************/
- #include "main.h"
- #include <string>
- #include <Windows.h>
- #include <wchar.h>
- using namespace std;
- wstring AsciiToUnicode(const string& str) {
- // 预算-缓冲区中宽字节的长度
- int unicodeLen = MultiByteToWideChar(CP_ACP, , str.c_str(), -, nullptr, );
- // 给指向缓冲区的指针变量分配内存
- wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);
- // 开始向缓冲区转换字节
- MultiByteToWideChar(CP_ACP, , str.c_str(), -, pUnicode, unicodeLen);
- wstring ret_str = pUnicode;
- free(pUnicode);
- return ret_str;
- }
- string UnicodeToAscii(const wstring& wstr) {
- // 预算-缓冲区中多字节的长度
- int ansiiLen = WideCharToMultiByte(CP_ACP, , wstr.c_str(), -, nullptr, , nullptr, nullptr);
- // 给指向缓冲区的指针变量分配内存
- char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);
- // 开始向缓冲区转换字节
- WideCharToMultiByte(CP_ACP, , wstr.c_str(), -, pAssii, ansiiLen, nullptr, nullptr);
- string ret_str = pAssii;
- free(pAssii);
- return ret_str;
- }
- wstring Utf8ToUnicode(const string& str) {
- // 预算-缓冲区中宽字节的长度
- int unicodeLen = MultiByteToWideChar(CP_UTF8, , str.c_str(), -, nullptr, );
- // 给指向缓冲区的指针变量分配内存
- wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);
- // 开始向缓冲区转换字节
- MultiByteToWideChar(CP_UTF8, , str.c_str(), -, pUnicode, unicodeLen);
- wstring ret_str = pUnicode;
- free(pUnicode);
- return ret_str;
- }
- string UnicodeToUtf8(const wstring& wstr) {
- // 预算-缓冲区中多字节的长度
- int ansiiLen = WideCharToMultiByte(CP_UTF8, , wstr.c_str(), -, nullptr, , nullptr, nullptr);
- // 给指向缓冲区的指针变量分配内存
- char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);
- // 开始向缓冲区转换字节
- WideCharToMultiByte(CP_UTF8, , wstr.c_str(), -, pAssii, ansiiLen, nullptr, nullptr);
- string ret_str = pAssii;
- free(pAssii);
- return ret_str;
- }
- /************************************
- @ Brief: ASSIC转UTF8
- @ Author: woniu201
- @ Created: 2018/10/16
- @ Return:
- ************************************/
- string AsciiToUtf8(const string& str) {
- return UnicodeToUtf8(AsciiToUnicode(str));
- }
- /************************************
- @ Brief: UTF8转ASSIC
- @ Author: woniu201
- @ Created: 2018/10/16
- @ Return:
- ************************************/
- string Utf8ToAscii(const string& str) {
- return UnicodeToAscii(Utf8ToUnicode(str));
- }
- #ifndef _MAIN_H
- #define _MAIN_H
- #include <iostream>
- #include <string>
- #include "include/curl.h"
- using namespace std;
- #pragma comment(lib, "ssleay32.lib")
- #pragma comment(lib, "libcurl.lib")
- string AsciiToUtf8(const string& str);
- string Utf8ToAscii(const string& str);
- int HttpGet(char* url);
- int HttpPost(char* url, char* body);
- int HttpDownload(char* url, char* filePath);
- #endif
对应libcurl库和头文件下载地址(支持HTTPS):点击下载
扫码关注公众号
专注分享C/C++,C++(11,14,17),STL,Java,Spring,mybatis,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,还有高薪互联网职位内推,在这里一起探讨,一起学习,一起进步,同时不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。
基于libcurl实现REST风格http/https的get和post的更多相关文章
- 基于MVC的RESTful风格的实现
基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...
- C++服务器开发之基于对象的编程风格
Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include <pthread.h> #include <boost/functio ...
- [解读REST] 4.基于网络应用的架构风格
上篇文章介绍了一组自洽的术语来描述和解释软件架构:如何利用架构属性评估一个架构风格:以及对于基于网络的应用架构来说,那些架构属性是值得我们重点关注评估的.本篇在以上的基础上,列举一下一些常见的(RES ...
- 基于MVC的RESTFul风格API实战
基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...
- 基于阿里云上实现全站https的正确姿势(一)
对应的网址:https://yq.aliyun.com/articles/65199 摘要: 目前主流大厂的网站和服务都已经实现了全站https, 例如: baidu, taobao, jd等. 关于 ...
- 基于libcurl的restfull接口 post posts get gets
头文件 #pragma once #ifndef __HTTP_CURL_H__ #define __HTTP_CURL_H__ #include <string> #include &q ...
- 基于Nginx服务器和iOS9的HTTPS安全通信
简介 在网络通信中,使用抓包软件可以对网络请求进行分析,并进行重放攻击,重放攻击的解决方案一般是使用一个变化的参数,例如RSA加密的时间戳,但考虑到网络传输时延,时间戳需要有一定的误差容限,这样仍然不 ...
- restfull 风格 参考 https://blog.csdn.net/jaryle/article/details/52141097
https://www.cnblogs.com/xiaoxian1369/p/4332390.html :
- Prometheus基于consul自动发现监控对象 https://www.iloxp.com/archive/11/
Prometheus 监控目标为什么要自动发现 频繁对Prometheus配置文件进行修改,无疑给运维人员带来很大的负担,还有可能直接变成一个“配置小王子”,即使是配置小王子也会存在人为失误的情况 ...
随机推荐
- solr特点七:Plugins(扩展点)
http://wiki.apache.org/solr/SolrPlugins 在 Solr 1.3 中,扩展 Solr 以及配置和重新整理扩展变得十分简单.以前,您需要编写一个 SolrReques ...
- CVE-2018-7600 Drupal核心远程代码执行漏洞分析
0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...
- 关于Office软件中Word输入时卡顿无反应的解决办法!
最近在安装office2013时遇到了这样一个问题,就是在激活office之后,打开Word输入内容时十分卡顿.也是狂搜网上各种办法,有说改注册表的,也有说在office选项里设置什么输入法的,全试了 ...
- .netcore Swagger 生成 api接口文档
1, 引用第三方包, Swashbuckle.AspNetCore Swashbuckle.AspNetCore.Swagger Swashbuckle.AspNetCore.SwaggerUI 最简 ...
- Sql语法高级应用之五:使用存储过程实现对明细多层次统计
前言 前面章节我们讲到了存储过程的基础用法,本章则将一个在项目中实际应用的场景. 在项目中经常会存在这样的需求,例如需要对明细列表进行按组.按级别.按人等进行统计,如果在附带列表的查询条件,又如何实现 ...
- ASP.NET WebApi总结之自定义权限验证
在.NET中有两个AuthorizeAttribute类, 一个定义在System.Web.Http命名空间下 #region 程序集 System.Web.Http, Version=5.2.3.0 ...
- Gogland使用 - 非常简单查看Go语言源代码全貌!
Go语言也支持面向对象开发,不过和以往我们所使用的面向对象开发还是有不同,Go语言主张组合方式形成类的概念,在Go语言中,结构起到很大作用,如果用结构组合字段和方法,那么单纯在源代码中看,真的是费时费 ...
- Java50道经典习题-程序17 猴子吃桃问题
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只 ...
- Java中 IO类 - File类中的判断功能
package com.hxzy.IOSer;import java.io.*;public class Demo05 { public static void main(String[] args) ...
- IIS7的网站通过https访问提示ssl_error_rx_record_too_long
IIS7的网站通过https访问,提示ssl_error_rx_record_too_long,如下图所示: 解决办法: 一.导入服务器的SSL证书至IIS 1.打开IIS,找到服务器证书 2.导入本 ...