VS2019利用Curl库实现HTTP网络通信(C++)

这篇具有很好参考价值的文章主要介绍了VS2019利用Curl库实现HTTP网络通信(C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        C++实现HTTP网络通信,一般采用两种方式,熟悉TCP协议的大哥可能不需要查这方面的知识;还有一种方式就是使用第三方库,Qt环境下可以用QNetworkRequest实现很方便,再就是Curl了,Curl是个独立的第三方库,不依赖于qt环境,可以实现GET和POST方式通信。

​         先说环境,VS2019;

一、Curl环境搭建

​         调用Curl的静态库/动态库是需要自己编译的;

1.1 文件下载

​         打开下载地址(curl - Download)下载对应版本的curl压缩包,本文下载7.65.0版本(也尝试了新版的7.8.0,但下一步编译未成功);

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

1.2 编译

​         下载好的文件解压缩到指定文件夹,然后双击运行【../curl-7.65.0/buildconf.bat】,一闪而过就结束了;

        ​ 在开始菜单的VS中找到【x64 Native Tools Command Prompt for VS 2019】,点击打开;

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

        进入到【../curl-7.65.0/winbuild】目录下,执行【nmake /f Makefile.vc mode=static VC=15 MACHINE=x64 DEBUG=no】;

        ​ 参数含义:

nmake /f Makefile.vc mode=static 		// 静态编译,也可mode=dll
						VC=15 		  // vc版本
						MACHINE=x64    // 64或32位
						DEBUG=no       // 改成yes就是Debug

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

         等待两三分钟,编译完成进入【../curl-7.65.0/builds】可见以下文件,第一个就是我们需要的,至此编译完成;

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

1.3 Curl开发环境配置

        新建一个测试工程,由于名字太长,将1.2步骤编译生成的文件夹重命名为【curl】,内含如下文件夹;

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

         右键工程属性,在VC++选项卡内,分别设置包含目录【../curl/include】库目录【../curl/lib】;

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

         C/C++选项卡,预处理器添加【CURL_STATICLIB】;

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

 链接器/输入选项卡,附加依赖项添加

libcurl_a.lib
Ws2_32.lib
Wldap32.lib
winmm.lib
Crypt32.lib
Normaliz.lib

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

         至此环境搭建完成,后续就可以在项目中正常使用了。

二、利用Curl库实现HTTP网络通信

2.1 测试

        ​ 测试代码如下:

#include <curl/curl.h>    

void testCurlFunc() {
	CURL* curl = 0;
	CURLcode res;
	curl = curl_easy_init();
	if (curl != 0) {
		// 设置url
		curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");
		//www.baidu.com 可能会跳转,所以设置为跟随跳转
		curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
		// 发出请求
		res = curl_easy_perform(curl);
		// 返回状态检查
		if (res != CURLE_OK) {
			fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
		}
		// 任务完成,清理工作
		curl_easy_cleanup(curl);
	}
}

        打印信息如下所示,表明成功:

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

2.2 关于打印信息乱码

        ​ 可以看到其中中文是乱码,这是由于返回的响应数据是utf编码方式,而debug或cout打印是GBK,可以在cout前面加一句【SetConsoleOutputCP(CP_UTF8);】,将打印编码设置为utf8就不乱码了,效果如下;

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

三、使用CURL发送GET请求

​         代码如下:

#include<curl\curl.h>
using namespace std;

//get请求和post请求数据响应函数
size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream)
{
	//在注释的里面可以打印请求流,cookie的信息
	//cout << "----->reply" << endl;
	string *str = (string*)stream;
	//cout << *str << endl;
	(*str).append((char*)ptr, size*nmemb);
	return size * nmemb;
}

//http GET请求  
CURLcode curl_get_req(const std::string &url, std::string &response)
{
	//curl初始化  
	CURL *curl = curl_easy_init();
	// curl返回值 
	CURLcode res;
	if (curl)
	{
		//设置curl的请求头,表头类型可能不同
		struct curl_slist* header_list = NULL;
		header_list = curl_slist_append(header_list, "Content-Type:application/json");
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);

		//不接收响应头数据0代表不接收 1代表接收
		curl_easy_setopt(curl, CURLOPT_HEADER, 0);

		//设置请求的URL地址 
		curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

		//设置ssl验证
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);

		//CURLOPT_VERBOSE的值为1时,会显示详细的调试信息
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);

		curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);

		//设置数据接收函数
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);

		curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);

		//设置超时时间
		curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 6); // set transport and time out time  
		curl_easy_setopt(curl, CURLOPT_TIMEOUT, 6);

		// 开启请求  
		res = curl_easy_perform(curl);
	}
	// 释放curl 
	curl_easy_cleanup(curl);
	return res;
}

int test_curl_get_req()
{
	string getUrlStr = "https://www.baidu.com/";
	string getResponseStr;
	auto res = curl_get_req(getUrlStr, getResponseStr);
	if (res == CURLE_OK)
	{
		cout << getResponseStr << endl;
	}
	getchar();
	return 0;
}

        打印信息如下:

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

四、使用CURL发送POST请求传递JSON数据

​         代码如下:

#include<iostream>
#include<string>
#include<curl\curl.h>
using namespace std;

//get请求和post请求数据响应函数
size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream)
{
	//在注释的里面可以打印请求流,cookie的信息
	//cout << "----->reply" << endl;
	string *str = (string*)stream;
	//cout << *str << endl;
	(*str).append((char*)ptr, size*nmemb);
	return size * nmemb;
}

//http POST请求  
CURLcode curl_post_req(const string &url, const string &postParams, string &response)
{
	// curl初始化  
	CURL *curl = curl_easy_init();
	// curl返回值 
	CURLcode res;
	if (curl)
	{
		// set params
		//设置curl的请求头
		struct curl_slist* header_list = NULL;
		header_list = curl_slist_append(header_list, "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko");
		header_list = curl_slist_append(header_list, "Content-Type:application/json; charset=UTF-8");
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);

		//不接收响应头数据0代表不接收 1代表接收
		curl_easy_setopt(curl, CURLOPT_HEADER, 0);

		//设置请求为post请求
		curl_easy_setopt(curl, CURLOPT_POST, 1);

		//设置请求的URL地址
		curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
		//设置post请求的参数
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postParams.c_str());

		//设置ssl验证
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);

		//CURLOPT_VERBOSE的值为1时,会显示详细的调试信息
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);

		curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);

		//设置数据接收和写入函数
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);

		curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);

		//设置超时时间(单位:s)
		curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
		curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);

		// 开启post请求
		res = curl_easy_perform(curl);
	}
	//释放curl 
	curl_easy_cleanup(curl);
	return res;
}

void test_curl_post_req()
{
	string url_post = "http://httpbin.org/post";	//设置URL

	Json::FastWriter writerinfo;
	Json::Value  writevalueinfo;
    writevalueinfo["username"] = "000001";
    writevalueinfo["password"] = "123456";
    string paramsLogin = writerinfo.write(writevalueinfo);	//设置post的json数据
	
	string resPost;	//返回值
	
	auto res3 = curl_post_req(url_post, paramsLogin, resPost);
	if (res3 == CURLE_OK)
	{
		cout << resPost << endl;
	}
}

        打印结果如下:

VS2019利用Curl库实现HTTP网络通信(C++),c++,http,网络协议,json,windows

五、其他

5.1 传递参数包含中文情况

        ​ 一般地,本地端采用GBK编码方式,服务器端采用utf-8方式编码;当GET url参数含有中文字符时,除了设置utf8编码外,还需要对其额外进行特殊处理;

 string input; // 此处的input必须是utf-8编码格式
 // 对请求参数中的中文和特殊字符(如空格等)进行处理,方可使用
 char * escape_control = curl_escape(input.c_str(), input.size());
 input = escape_control;
 curl_free(escape_control);
 // 接下来就可以把input传入url了;

5.2 关于时间戳

​         网络通信传输数据多见有时间戳属性,一并整理:

// 日期转时间戳函数
time_t convert_str_to_tm(const char * str_time)
{
	struct tm tt;
	memset(&tt, 0, sizeof(tt));
	tt.tm_year = atoi(str_time) - 1900;
	tt.tm_mon = atoi(str_time + 5) - 1;
	tt.tm_mday = atoi(str_time + 8);
	tt.tm_hour = atoi(str_time + 11);
	tt.tm_min = atoi(str_time + 14);
	tt.tm_sec = atoi(str_time + 17);
	return mktime(&tt);
}

// 测试:日期转时间戳,再转为字符串
string date = "2023-02-07 09:56:40";
time_t timeStamp = convert_str_to_tm(date.c_str());
std::string strTimeStamp = "";
stringstream ss;
ss << timeStamp;
strTimeStamp = ss.str();
cout << "Time Stamp:" << timeStamp<<"\t"<< strTimeStamp << endl;

六、参考链接

Visual Studio(VS2017/VS2019)编译并配置C/C++-libcurl开发环境

Visual Stdio2019下配置Libcurl的详细教程

Curl(C++)使用教程

C++使用curl发送get请求

C++使用curl发送post请求

C++使用CURL库POST请求向服务器发送JSON数据

C++ MFC 时间戳与日期格式相互转换

CTime 转 时间戳文章来源地址https://www.toymoban.com/news/detail-573248.html

到了这里,关于VS2019利用Curl库实现HTTP网络通信(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTTP与HTTPS:网络通信的安全卫士

    目录 引言 1. HTTP(Hypertext Transfer Protocol) 1.1HTTP的基本概念 1.2 HTTP的工作原理 1.3 HTTP请求与响应 1.4HTTP特点 1.4.1 无状态性 1.4.2 明文传输 1.4.3 简单快速 1.5 HTTP的安全性 2. HTTPS(Hypertext Transfer Protocol Secure) 2.1HTTPS:为网络通信加上安全锁 2.2HTTPS相较于HTTP有以下显著特点 2.2.1 数

    2024年01月20日
    浏览(58)
  • GO学习之 网络通信(Net/Http)

    1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Http) 11、GO学习之 微框架(Gin) 12、GO学习

    2024年02月13日
    浏览(52)
  • TCPIP vs OSI模型:网络通信的两种参考模型有哪些不同?

    前言   欢迎来到今天的每日一题,每日一提。昨天聊的是面试中经常会问到tcp协议 。在面试中一旦问到TCP/IP,那么OSI模型肯定是躲不过的。如果直接回答OSI模型有7层,和TCP/IP的区别就是层数不一样。那么恭喜你可以提前回去等通知了。所以今天就聊聊,什么是OSI模型和

    2023年04月13日
    浏览(50)
  • 【Unity】UnityWebRequest学习——Unity中的HTTP网络通信

    Unity中的HTTP通信主要依赖的是Unity自带的UnityWebRequest类。UnityWebRequest 提供了一个模块化系统,用于构成 HTTP 请求和处理 HTTP 响应。 UnityWebRequest 生态系统将 HTTP 事务分解为三个不同的操作: 向服务器提供数据 从服务器接收数据 HTTP 流量控制(例如,重定向和错误处理) 对于

    2024年01月23日
    浏览(64)
  • python基于http的网络通信和网站端口暴露;Python网络编程之HTTP协议的python应用

    HTTP(Hypertext Transfer Protocol)即超文本传输协议,是Web应用程序使用的协议,在Web浏览器和Web服务器之间传递HTML页面和数据。HTTP是基于TCP/IP协议来传输数据的,是一种无状态的协议。 关键特点: 支持客户/服务器模式:Web浏览器作为HTTP客户端通过URL向HTTP服务器发送HTTP请求,

    2024年02月04日
    浏览(56)
  • 网络通信协议-HTTP、WebSocket、MQTT的比较与应用

    在今天的数字化世界中,各种通信协议起着关键的作用,以确保信息的传递和交换。HTTP、WebSocket 和 MQTT 是三种常用的网络通信协议,它们各自适用于不同的应用场景。本文将比较这三种协议,并探讨它们的主要应用领域。 HTTP (超文本传输协议) HTTP  是最常见的协议之一

    2024年02月05日
    浏览(61)
  • 探究代理技术在网络安全、爬虫与HTTP通信中的多重应用

    在当今高度互联的世界中,代理技术在网络安全、爬虫开发以及HTTP通信中扮演着举足轻重的角色。本文将深入探讨Socks5代理、IP代理以及HTTP代理在这些领域中的多重应用,探索其如何为我们创造更安全、高效的网络环境。 1. Socks5代理:构建安全通道与绕过限制 Socks5代理作为

    2024年02月11日
    浏览(46)
  • 常见网络通信协议(http、https、ws)及安全协议(SSL、TLS、XTLS)

    文章内容删除了一大半不合适的内容,发不出来,你懂得。🥰 HTTP和HTTPS都属于 应用层协议 ,它们都是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。它们都是 基于 TCP/IP 协议 来传递数据的,支持 客户端-服务器模式 的通信。 HTTP和HTTPS的区别主要在于HTT

    2024年02月10日
    浏览(51)
  • libcurl是一个用于进行网络通信的开源库,提供了各种功能和选项,可以用于发送和接收HTTP请求、FTP操作等

    libcurl是一个用于进行网络通信的开源库,提供了各种功能和选项,可以用于发送和接收HTTP请求、FTP操作、SMTP邮件等。它支持多种协议,包括HTTP、HTTPS、FTP、FTPS、SMTP、POP3、IMAP等。 以下是libcurl库的一些特点和功能: 跨平台:libcurl可在多个操作系统上使用,包括Windows、Lin

    2024年01月19日
    浏览(50)
  • Android Studio App开发之网络通信中使用GET方式调用HTTP接口的讲解及实战(附源码 超详细必看)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ Android开发采用Java作为编程语言,也就沿用了Java的HTTP连接工具HttpURLConnection,不管是访问HTTP接口还是上传或下载文件都是用它来实现。它有几个关键点 1:HttpURLConnection默认采取国际通行的UTF-8编码,中文用GBK编码 2:多数

    2024年02月05日
    浏览(109)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包