c++配置http/post请求接收json数据

照着教程编译操作都没问题
首先是配置curl库
给一个别人的编译链接curl库 vs2017:亲测可用
c++编译curl库

测试代码:

#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库:
有两个版本,一个支持c++11 是1.几版本的,一个不支持0.10.7(我用的是这个)
同样也是找别人的:亲测可用
c++配置json库

下面是测试代码

#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
包含库路径:
E:\C++库\curl库\cur\libcurl-vc14-x86-release-static-ipv6-sspi-winssl\include
预处理器:
CURL_STATICLIB
_CRT_SECURE_NO_WARNINGS
包含库路径和依赖库名字:
把lib拷到对应的文件下
依赖库:
libcurl_a.lib
ws2_32.lib
winmm.lib
wldap32.lib
Crypt32.lib
Normaliz.lib

头文件

#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);


};


cpp文件

#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写个接口测试吧。我这里是获取了它返回的数据。
也可以根据返回的状态码进行判断,是否接收成功。根据实际要求操作。
在这里插入图片描述

下面给一个官方的curlAPI地址:
官方API地址

参考文章:
网友幸福官请求响应
curl使用教程

更新2022-02-09

解析json

//获取指定关键字的值   "name\":\"abc"
string getValue(Json::Value jsonItem,string key)
{
	if (jsonItem.isMember(key))
	{
		return jsonItem[key].asString();
	}
	return "error";
}
//获取某个根结点的值 "aa\":{\"bb\":\"123\"}}"
Json::Value getRootValue(string str, string key)
{
	Json::Reader reader;
	Json::Value root;
	Json::Value value;
	if (reader.parse(str, root))
	{
		int size = root.size();   // 根结点个数

		for (int j = 0; j < size; j++)
		{
			if (!root[key].isNull())
			{
				return root[key];
			}
		}
	}
	return value;
}
//json转string
string str;
str = jsonItem.toStyledString();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值