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的更多相关文章

  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. api接口响应类型定义

    public class Response<T> { public ResponseStatus Status { get; set; } public string Message { ...

  2. HTTP Error 502.5 - Process Failure Win10 VS可以正常访问,部署本地IIS报错

    最近本core得升级导致各种问题,之前刚解决了server2012的502.5问题 今天本机又出现这个问题. 情况描述:VS可以正常调试查看,部署本地IIS访问 错误502.5 分析:VS可以使用II ...

  3. 细节之strcat

    写代码也这么多年了,有些非常基础的东西却让我差点栽跟头: 有如下一种场景的需求代码: char tmp; ]; memset(input, , ); ) // ptr是得到了某块全局内存的 { tmp ...

  4. Spring Boot 学习系列(06)—采用log4j2记录日志

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...

  5. 【OCP-12c】CUUG 071题库考试原题及答案解析(16)

    16.(7-5) choose the best answerThe PRODUCTS table has the following structure:Evaluate the following ...

  6. 超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群

    超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群 ps:本文的步骤已自实现过一遍,在正文部分避开了旧版教程在新版使用导致出错的内容,因此版本一致的情况下照搬执行基本不会有大错误. ...

  7. BZOJ4283: 魔法少女伊莉雅(最短路径图+最短路径树)

    题面 传送门 题解 太长了不想写了→_→ 题解 //minamoto #include<bits/stdc++.h> #define R register #define inf 0x3f ...

  8. NOI2019省选模拟赛 第五场

    爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...

  9. 反弹Shell小结

    1.NC反弹shell 1.1.正向反弹shell 服务器 nc -lvvp 7777 -e /bin/bash 攻击机 nc  server-ip 7777 1.2.反向反弹shell 攻击机 nc ...

  10. express 直接返回HTML文件

    一般情况下用的是模板引擎,如jade: res.render('detail',{ // 使用render() #http://www.expressjs.com.cn/4x/api.html#res ...