2023.7.18 Update: 【LibCurl】C++使用libcurl实现HTTP POST和GET

要想使用 LibCURL 库,首先需配置 CURL 库

参考链接:【C++开源库】Windows 下编译 libcurl 库

// 测试代码
#include <iostream>
using namespace std;;
int main()
{
curl_easy_init();
return 0;
} // 没报错即配置成功

下面是上传json数据代码(下面以字符串为例子)

我手动拼接json字符串就不用配置json库了(配置json库在下面)

#include <curl/curl.h>
#include <string>
#include <exception>
#include <iostream>
using namespace std; int main(int argc, char *argv[])
{
//下面是json数据格式
char szJsonData[1024];
memset(szJsonData, 0, sizeof(szJsonData));
string aa = "123";
string strJson = "{";
strJson += ""hex" : "" + aa + "",";
strJson += ""aa" : "123",";
strJson += ""bb" : "123",";
strJson += ""cc" : "123"";
strJson += "}";
strcpy(szJsonData, strJson.c_str()); try
{
CURL *pCurl = NULL;
CURLcode res;
// In windows, this will init the winsock stuff
curl_global_init(CURL_GLOBAL_ALL); // get a curl handle
pCurl = curl_easy_init();
if (NULL != pCurl)
{
// 设置超时时间为1秒
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 1); // First set the URL that is about to receive our POST.
// This URL can just as well be a
// https:// URL if that is what should receive the data.
curl_easy_setopt(pCurl, CURLOPT_URL, "your URL"); // 设置http发送的内容类型为JSON
curl_slist *plist = curl_slist_append(NULL,
"Content-Type:application/json;charset=UTF-8");
curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, plist); // 设置要POST的JSON数据
curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, szJsonData); // Perform the request, res will get the return code
res = curl_easy_perform(pCurl);
// Check for errors
if (res != CURLE_OK)
{
printf("curl_easy_perform() failed:%s\n", curl_easy_strerror(res));
}
// always cleanup
curl_easy_cleanup(pCurl);
}
curl_global_cleanup();
}
catch (std::exception &ex)
{
printf("curl exception %s.\n", ex.what());
} return 0;
}

配置 JSON 第三方库

  • cJSON

    git clone https://github.com/DaveGamble/cJSON.git
    # 拉取最新的 cJSON 版本
    # 把文件夹下的 cJSON.h 和 cJSON.c 文件放在自己的项目文件夹下即可
  • jsoncpp

    参考文章:https://www.cnblogs.com/tudou/p/14957646.html

下面是测试代码:

#include <iostream>
#include "json/json.h"
using namespace std;
int main()
{
string aa = "123";
//Json::Value jsonRoot; //定义根节点
Json::Value jsonItem; //定义一个子对象
jsonItem["hexImage"] =aa; //添加数据 //jsonRoot.append(jsonItem);
//jsonItem.clear(); //清除jsonItem //jsonRoot["item"] = jsonItem;
cout << jsonItem.toStyledString() << endl; //输出到控制台 //解析字符串--输入json字符串,指定解析键名,得到键的值。
string str=jsonItem.toStyledString();
Json::Reader reader;
Json::Value root; //定义一个子对象
if (reader.parse(str, root))
{
string jsstr= root["hexImage"].asString();
cout << "jsstr:" << jsstr<< endl;
}
return 0;
}

下面给一个封装curl的类给大家使用。需要根据你需要的版本进行编译对应x86和x64

博主使用的是 VS2013 + x86 版本

// 头文件
#pragma once
#include <iostream> using namespace std;
class Httpcurl
{
public: //初始化curl库
void initcurl(); //释放curl库
void closecurl(); //接口请求
std::string requesthttp(std::string sendstr, std::string url);
};
// 实现文件
#include "Httpcurl.h"
#include <curl/curl.h> //回调函数
size_t http_data_writer(void* data, size_t size, size_t nmemb, void* content)
{
long totalSize = size * nmemb;
//强制转换
std::string* symbolBuffer = (std::string*)content;
if (symbolBuffer)
{
symbolBuffer->append((char *)data, ((char*)data) + totalSize);
}
//cout << "symbolBuffer:" << symbolBuffer << endl;
//返回接受数据的多少
return totalSize;
} void Httpcurl::initcurl()
{
//初始化curl库
curl_global_init(CURL_GLOBAL_ALL);
} void Httpcurl::closecurl()
{
//释放内存,curl库
curl_global_cleanup();
} //输入请求json,返回string
std::string Httpcurl::requesthttp(std::string sendstr, std::string url)
{
std::string strData;
CURL *pCurl = NULL;
CURLcode res;
// 获得一个句柄
pCurl = curl_easy_init();
if (NULL != pCurl)
{
// 设置超时时间为1秒
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 1); //设置url
curl_easy_setopt(pCurl, CURLOPT_URL, const_cast<char *>(url.c_str())); // 设置http发送的内容类型为JSON格式
curl_slist *plist = curl_slist_append(NULL,
"Content-Type:application/json;charset=UTF-8");
curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, plist); // 设置要POST的JSON数据
curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, sendstr.c_str()); // 设置回调函数
curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, http_data_writer);
//设置写数据 curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, (void*)&strData); // 请求成功
res = curl_easy_perform(pCurl); // Check for errors
if (res != CURLE_OK)
{
printf("请求失败\n");
return "error";
}
else
{
cout << "请求成功" << endl;
} // always cleanup
curl_easy_cleanup(pCurl);
}
return strData;
}
// main.cpp
#include <iostream>
#include "json/json.h"
#include "Httpcurl.h"
using namespace std; int main(int argc, char *argv[])
{ Json::Value jsonItem; //定义一个子对象
jsonItem["aaa"] = "123"; //添加数据
jsonItem["bbb"] = "456"; //添加数据 string str = jsonItem.toStyledString(); string url = "http://localhost:8080/test"; Httpcurl httpcurl;
httpcurl.initcurl();
cout << httpcurl.requesthttp(str,url) << endl;
httpcurl.closecurl(); getchar(); return 0;
}

响应什么大家自己用web写个接口测试吧。我这里是获取了它返回的数据。

也可以根据返回的状态码进行判断,是否接收成功。根据实际要求操作。

【C++】使用 curl 库配置 HTTP 的 Post/Get 请求响应数据(封装一个简单类)的更多相关文章

  1. 使用libzplay库封装一个音频类

    装载请说明原地址,谢谢~~      前两天我已经封装好一个duilib中使用的webkit内核的浏览器控件和一个基于vlc的用于播放视频的视频控件,这两个控件可以分别用在放酷狗播放器的乐库功能和MV ...

  2. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  3. SpringMVC_01 SpringMVC五大组件、SpringMVC编程步骤(不使用注解进行配置)、SpringMVC编程步骤(利用注解进行配置)、参数获取、响应数据

    1 什么是SpringMVC 是一个mvc框架,用来简化基于mvc架构的web应用程序的 开发. 2 SpringMVC五大组件 DispatcherServlet (前端控制器) HanlderMa ...

  4. 嵌入式 Linux下curl库API简单介绍

    1:CURLcode curl_global_init(long flags); 这个函数全局需要调用一次(多次调用也可以,不过没有必要), 所以这也是把Curlplus设计成单体类的原因,curl_ ...

  5. CURL库在C++程序中的运用浅析

    最近由于要做一个爬虫项目,要对很多网站进行爬取,所以一直都在看这方面的文章.在翻阅了很多资料后,下载了一个curl库,着实对项目有了很大的帮助. 一.LibCurl基本编程框架 二.一些基本的函数 三 ...

  6. [转]linux 下 使用 c / c++ 调用curl库 做通信开发

    example:   1. http://curl.haxx.se/libcurl/c/example.html  2. http://www.libcurl.org/book:  1. http:/ ...

  7. Spring Boot 揭秘与实战 自己实现一个简单的自动配置模块

    文章目录 1. 实战的开端 – Maven搭建 2. 参数的配置 - 属性参数类 3. 真的很简单 - 简单的服务类 4. 自动配置的核心 - 自动配置类 5. spring.factories 不要 ...

  8. 从零开始配置一个简单的webpack打包

    一.基础配置 1.创建一个名为demo-webpack的文件夹(名称随意) 2.初始化一个package.json文件 //在cmd窗口中使用以下命令快速创建 npm init -y 3.安装webp ...

  9. linux编译curl库的动态库so(转)

    转载请注明出处:帘卷西风的专栏(http://blog.csdn.NET/ljxfblog) curl库是一个很强大的http开源库,c++里面能够很方便的和http服务器交互. 最近项目开始内测,开 ...

  10. curl库 c语言的curl 编程

    c语言的curl 编程 [Linux@centos-64-min exercise]# gcc -Wall -o curltest curltest.c /tmp/ccosVANi.o: In fun ...

随机推荐

  1. 七天.NET 8操作SQLite入门到实战 - 第二天 在 Windows 上配置 SQLite环境

    前言 SQLite的一个重要的特性是零配置的.无需服务器,这意味着不需要复杂的安装或管理.它跟微软的Access差不多,只是一个.db格式的文件.但是与Access不同的是,它不需要安装任何软件,非常 ...

  2. Windows_Cmd常用操作配置

    目录 特定功能执行命令 显示系统当前版本 电源管理 历史命令相关 显示路由表 显示本地 ARP 缓存 测试主机 联通性 查看网卡信息 修改DOS窗口中的编码格式 诊断域名系统 (DNS) 基础结构的信 ...

  3. 【UniApp】-uni-app-全局数据和局部数据

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-全局样式和局部样式 那么了解完了全局样式和局部样式之后,这篇文章我再来给大家介绍一下 UniApp 中全局数据和局部数据 搭建演示环境 ...

  4. Python 提取 Word 文档中的文本和图片

    将内容从 Word 文档中提取出来可以方便我们对其进行其他操作,如将内容储存在数据库中.将内容导入到其他程序中.用于 AI 训练以及制作其他文档等.第三方库 Spire.Doc for Python  ...

  5. vue3.3新特性defineOptions

    当我们使用选项式api时候,可以轻松创建与setup()选项同级别的选项. 但是,用了

  6. keystone和beaengine的编译

    编译Keystone 根据github的文档编译不出来,所以还是用CMake项目转成Visual Studio的项目来编译 1.下载源码 https://github.com/keystone-eng ...

  7. 【Python】【OpenCV】绘制外接矩形、外接圆

    外接矩形.外接圆: 1 import cv2 2 import numpy 3 4 img = cv2.imread('../img/img.png', -1) 5 ret, thresh = cv2 ...

  8. 2023.3 Idea配置Tomcat环境

    tomcat配置 下载tomcat 先到官网(按住Ctrl再左键点击直接打开官网)下载64位的tomcat,网速慢就用魔法下 创建项目.模块 打开idea(我用的是最新的idea的专业版,ui有点变化 ...

  9. CTFHub XSS 过滤关键词 WriteUp

    前文链接:DOM反射xss 这次直接浏览器输入payload,发现 script 被过滤掉了 </textarea>'"><script src=http://xss ...

  10. JSON字符串中获取一个特定字段的值

    第一种 import com.google.gson.JsonObject; import com.google.gson.JsonParser; String json="{\" ...