C++ vs2017 http简单post/get请求

2023-05-16

文章参考:https://blog.csdn.net/u014049599/article/details/79998674
一、编写“HttpRequest.h”文件

#pragma once
#include <string>
#include <vector>

#include<map>
#include <curl/curl.h>

class HttpRequest
{
public:
	HttpRequest(const std::string& ip, int port);
	~HttpRequest(void);

	// Http GET请求
	std::string HttpGet(std::string req);

	// Http POST请求
	std::string HttpPost(std::string req, std::string data);

	// 合成JSON字符串  string int
	static std::string genJsonString(std::string key, int value);
	// 合成JSON字符串  string  string
	static std::string genJsonString_string(std::map<std::string, std::string>  mapRequest);

	// 分割字符串
	static std::vector<std::string> split(const std::string &s, const std::string &seperator);

	// 根据key从Response获取Header中的内容
	static std::string getHeader(std::string respose, std::string key);
	//curl 发送请求
	//bool SendHttpUrl(std::string URL ,std::string strUrl);
	//解析json 字符串 获取指定返回值
	//static std::string HttpRequest::ParseJsonInfo(const std::string &strJsonInfo);

private:
	std::string         m_ip;
	int             m_port;
};

二、编写“HttpRequest.cpp”文件

#include "HttpRequest.h"
#include <WinSock.h>
#include <iostream>

#include <sstream>


#pragma warning(disable : 4996)

#pragma comment(lib, "ws2_32.lib")

size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream);


HttpRequest::HttpRequest(const std::string& ip, int port) : m_ip(ip), m_port(port)
{
}


HttpRequest::~HttpRequest(void)
{
}

// Http GET请求
std::string HttpRequest::HttpGet(std::string req)
{
	std::string ret = ""; // 返回Http Response
	try
	{
		// 开始进行socket初始化
		WSADATA wData;
		::WSAStartup(MAKEWORD(2, 2), &wData);

		SOCKET clientSocket = socket(AF_INET, 1, 0);
		struct sockaddr_in ServerAddr = { 0 };
		ServerAddr.sin_addr.s_addr = inet_addr(m_ip.c_str());
		ServerAddr.sin_port = htons(m_port);
		ServerAddr.sin_family = AF_INET;
		int errNo = connect(clientSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));
		if (errNo == 0)
		{
			//  "GET /[req] HTTP/1.1\r\n"  
			//  "Connection:Keep-Alive\r\n"
			//  "Accept-Encoding:gzip, deflate\r\n"  
			//  "Accept-Language:zh-CN,en,*\r\n"
			//  "User-Agent:Mozilla/5.0\r\n\r\n";
			std::string strSend = " HTTP/1.1\r\n"
				"Cookie:16888\r\n\r\n";
			strSend = "GET " + req + strSend;

			// 发送
			errNo = send(clientSocket, strSend.c_str(), strSend.length(), 0);
			if (errNo > 0)
			{
				//cout << "发送成功" << endl;
			}
			else
			{
				std::cout << "errNo:" << errNo << std::endl;
				return ret;
			}

			// 接收
			char bufRecv[3069] = { 0 };
			errNo = recv(clientSocket, bufRecv, 3069, 0);
			if (errNo > 0)
			{
				ret = bufRecv;// 如果接收成功,则返回接收的数据内容  
			}
			else
			{
				std::cout << "errNo:" << errNo << std::endl;
				return ret;
			}
		}
		else
		{
			errNo = WSAGetLastError();
			std::cout << "errNo:" << errNo << std::endl;
		}
		// socket环境清理
		::WSACleanup();
	}
	catch (...)
	{
		return "";
	}
	return ret;
}

// Http POST请求
std::string HttpRequest::HttpPost(std::string req, std::string data)
{
	std::string ret = ""; // 返回Http Response
	try
	{
		// 开始进行socket初始化;
		WSADATA wData;
		::WSAStartup(MAKEWORD(2, 2), &wData);

		SOCKET clientSocket = socket(AF_INET, 1, 0);
		struct sockaddr_in ServerAddr = { 0 };
		ServerAddr.sin_addr.s_addr = inet_addr(m_ip.c_str());
		//ServerAddr.sin_addr.s_addr = InetPton(m_ip.c_str());
		ServerAddr.sin_port = htons(m_port);
		ServerAddr.sin_family = AF_INET;
		int errNo = connect(clientSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));
		if (errNo == 0)
		{
			// 格式化data长度
			char len[10] = { 0 };
			sprintf(len, "%d", data.length());
			std::string strLen = len;

			//  "POST /[req] HTTP/1.1\r\n"
			//  "Connection:Keep-Alive\r\n"
			//  "Accept-Encoding:gzip, deflate\r\n"
			//  "Accept-Language:zh-CN,en,*\r\n"
			//  "Content-Length:[len]\r\n"
			//  "Content-Type:application/x-www-form-urlencoded; charset=UTF-8\r\n"
			//  "User-Agent:Mozilla/5.0\r\n\r\n"
			//  "[data]\r\n\r\n";
			std::string strSend = " HTTP/1.1\r\n"
				"Cookie:16888\r\n"
				"Content-Type:application/x-www-form-urlencoded\r\n"
				"Charset:utf-8\r\n"
				"Content-Length:";
			strSend = "POST " + req + strSend + strLen + "\r\n\r\n" + data;

			// 发送
			errNo = send(clientSocket, strSend.c_str(), strSend.length(), 0);
			if (errNo > 0)
			{
				//cout<<"发送成功\n";
			}
			else
			{
				std::cout << "errNo:" << errNo << std::endl;
				return ret;
			}

			// 接收
			char bufRecv[3069] = { 0 };
			errNo = recv(clientSocket, bufRecv, 3069, 0);
			if (errNo > 0)
			{
				ret = bufRecv;// 如果接收成功,则返回接收的数据内容
			}
			else
			{
				std::cout << "errNo:" << errNo << std::endl;
				return ret;
			}
		}
		else
		{
			errNo = WSAGetLastError();
		}
		// socket环境清理
		::WSACleanup();
	}
	catch (...)
	{
		return "";
	}
	return ret;
}

// 合成JSON字符串 string int 
std::string HttpRequest::genJsonString(std::string key, int value)
{
	char buf[128] = { 0 };
	sprintf(buf, "{\"%s\":%d}", key.c_str(), value);
	std::string ret = buf;
	return ret;
}

// 合成JSON字符串  string  string 
std::string HttpRequest::genJsonString_string(std::map<std::string, std::string> mapRequest)
{
	std::map<std::string, std::string>::iterator iter;
	std::string ret = "{";
	char buf[128] = { 0 };
	for(iter = mapRequest.begin(); iter != mapRequest.end(); ++iter)
	{
		sprintf(buf, "\"%s\":\"%s\"", iter->first.c_str(), iter->second.c_str());
		ret = ret + buf + ",";
		//std::cout << iter->first << ":" << iter->second << std::endl;
	}
	ret = ret.substr(0, ret.length()-1);
	ret = ret + "}";
	/*char buf[128] = { 0 };
	sprintf(buf, "{\"%s\":%s}", key.c_str(), value.c_str());
	
	std::string ret = buf;*/
	std::cout << "json: " << ret << std::endl;
	return ret;
}

// 分割字符串
std::vector<std::string> HttpRequest::split(const std::string &s, const std::string &seperator)
{
	std::vector<std::string> result;
	typedef std::string::size_type string_size;
	string_size i = 0;

	while (i != s.size()) {
		// 找到字符串中首个不等于分隔符的字母
		int flag = 0;
		while (i != s.size() && flag == 0) {
			flag = 1;
			for (string_size x = 0; x < seperator.size(); ++x)
				if (s[i] == seperator[x]) {
					++i;
					flag = 0;
					break;
				}
		}

		// 找到又一个分隔符,将两个分隔符之间的字符串取出
		flag = 0;
		string_size j = i;
		while (j != s.size() && flag == 0) {
			for (string_size x = 0; x < seperator.size(); ++x)
				if (s[j] == seperator[x]) {
					flag = 1;
					break;
				}
			if (flag == 0)
				++j;
		}
		if (i != j) {
			result.push_back(s.substr(i, j - i));
			i = j;
		}
	}
	return result;
}

// 从Response中查找key对应的Header的内容
std::string HttpRequest::getHeader(std::string respose, std::string key)
{
	std::vector<std::string> lines = split(respose, "\r\n");
	std::cout << "lines size: " << lines.size() << std::endl;
	for (int i = 0; i < lines.size(); i++)
	{
		std::vector<std::string> line = split(lines[i], ": ");// 注意空格

		std::cout << "line[0]: " << line[0] << std::endl;
		if (line.size() >= 2 && line[0] == key)
		{
			return line[1];
		}
	}
	return "";
}

三、测试代码

// test4HTTP.cpp : 定义控制台应用程序的入口点。
//

#include "HttpRequest.h"
#include <iostream>
#include <Windows.h>

#include <json/json.h>

using namespace std;
//int _tmain(int argc, _TCHAR* argv[])
int main()
{
	HttpRequest httpReq("IP地址",端口);

	//std::string res = httpReq.HttpGet("/getsomething/");
	//std::cout << res << std::endl;
	//Sleep(1000);

	//构建json数据 
	std::map<std::string, std::string> mapRequest;
	mapRequest.insert(pair<string, string>("devno", "3333"));
	mapRequest.insert(pair<string, string>("regtime", "2019-05-27 15:20:00"));
	mapRequest.insert(pair<string, string>("diskno", "5555"));
	mapRequest.insert(pair<string, string>("phoneno", "13855647894"));
	std::string request_string = HttpRequest::genJsonString_string(mapRequest);
	std::string res = httpReq.HttpPost("api接口", request_string);
	
	std::cout << res << std::endl;
	std::string str_status = res.substr(res.rfind("status") + 9, 1);
	//std::string str_status=httpReq.getHeader(res,"status");
	std::cout <<"str_status: "<< str_status << std::endl;
	if (stoi(str_status)==0) {
		std::cout << "regist success " << std::endl;

	}
	else {
		std::cout << "regist fail " << std::endl;
	}

	system("pause");
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ vs2017 http简单post/get请求 的相关文章

  • 是否可以在ajax get请求中获取页面的一部分?

    我知道我们可以在向服务器发出 GET 请求时获取整个页面 但是如果我只对该页面上的一个特定 div 感兴趣 或者更准确地说对其内容感兴趣 该怎么办 这里唯一的选择是获取整个页面 例如使用 jquery find 从中获取 div 内容吗 或
  • 是否有用于通过 HTTP、HTTP 隧道发送二进制数据的 Java 库?

    我想通过 HTTP 以二进制格式发送相当大的数据块 也称为HTTP 隧道 http en wikipedia org wiki HTTP tunnel 我想通过 Java 将这种技术用于一些 Java Swing 应用程序 也可能是 And
  • 减少1000张图片的HTTP请求?

    我知道这个问题可能听起来有点疯狂 但我想也许有人会想出一个聪明的主意 假设您在一个 HTML 页面上有 1000 个缩略图 图像大小约为5 10 kb 有没有办法在单个请求中加载所有图像 以某种方式将所有图像压缩到一个文件中 或者您对该主题
  • 使用 Google OAuth2.0 时出现错误请求

    从 Salesforce 中使用 Google OAuth 时 我收到 400 错误请求 以下错误与无效的 grant type 有关 但如果您查看 使用刷新令牌 下的文档 您会发现它是正确的 https developers google
  • Android:从 https url 获取响应

    问候 我正在开发一个 Android 应用程序 需要通过 https 打开一个 url 带有 POST 参数 并获取响应 我有一个自签名证书 这让情况更加复杂 我还需要接受cookies 有人知道从哪里开始吗 提前谢谢了 Android 附
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • 在 HTML
    中发布额外的值

    我有一个简单的表单 它传递一个值
  • 通过 HTTPS 加载页面但请求不安全的 XMLHttpRequest 端点

    我有一个页面 上面有一些 D3 javascript 该页面位于 HTTPS 网站内 但证书是自签名的 当我加载页面时 我的 D3 可视化效果不显示 并且出现错误 混合内容 页面位于 https integration jsite com
  • 使标签充当输入按钮

    我怎样才能做一个 a href http test com tag test Test a 就像表单按钮一样 通过充当表单按钮 我的意思是 当单击链接执行操作时method get 或 post 以便能够通过 get 或 post 捕获它
  • 使用特定 HTTP 方法链接到页面 (DELETE)

    如何像 Rails 那样链接到页面并让浏览器使用 DELETE 方法调用它 我试过 a href DELETE ME a 但不起作用 我使用 Node js 所以我可以用它来处理 DELETE 方法 你不能 链接只会触发 GET 请求 您可
  • Chrome 开发工具无法显示响应,即使返回的内容具有标题 Content-Type:text/html;字符集=UTF-8

    为什么我的 Chrome 开发者工具显示 无法显示响应数据 当返回的内容是text html类型时响应 在开发者工具中查看返回的响应的替代方法是什么 我认为只有当您选中 保留日志 并且您在导航离开后尝试查看先前请求的响应数据时 才会发生这种
  • Android - API 请求

    我开发了一个应用程序 它也在 iPhone 上 问题出在 api 请求上 我为所有请求设置了超时 有时会出现 30 60 秒的中断 看起来这个应用程序执行了几个请求 然后就中断了 一直超时 大约 45 秒后一切正常 不知道是服务器问题还是安
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • Node.js:server.setTimeout、server.timeout 和 server.keepAliveTimeout 之间有什么区别

    官方文档是here https nodejs org api http html http server settimeout msecs callback server setTimeout 中没有提及有关服务下一个请求的信息 所以我认为
  • 服务器响应中的“连接:保持活动状态”

    我正在尝试建立从 Silverlight 应用程序到 Apache 服务器托管的 PHP 页面的 HTTP 持久连接 即无需为每个 HTTP 请求创建新的 TCP 连接 为此 我需要网络服务器发送其 HTTP 响应 并将 Connectio
  • WCF WebHttp 混合身份验证(基本和匿名)

    所有这些都与 WebHttp 绑定有关 托管在自定义服务主机中 IIS 目前不是一个选项 我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy 当我将端点的绑定配置为使用
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • Angular 2 - Http - 正确忽略空结果

    我有很多处理请求并简单返回 200 的 REST 端点 我注意到将结果映射为错误json 如果我尝试不进行任何类型的映射 我会看到浏览器警告它无法解析 XML 由于不返回任何内容是很常见的 我很好奇我应该如何处理响应 这是一个基本的代码示例
  • Flutter http请求上传mp3文件

    我使用这个 api 上传 mp3 文件 使用这种方法 Future

随机推荐

  • 多播的概念

    一 多播概述 多播 xff1a 数据的收发仅仅在同一组中进行 xff08 相当于我往一个群里发 xff0c 只有加入这个群的人才能收到 xff09 多播的特点 xff1a 多播地址标示一组接口 多播可以用于广域网使用 在IPv4 xff0c
  • 利用C语言编写一个网络分析器

    一 链路层数据格式 mac报文 xff1a 14个字节 二 IP数据报文格式 三 TCP数据报文格式 四 UDP数据报文格式 五 demo xff08 网络分析器 xff09 recvfrom接收链路层帧数据 xff0c 不经过网络层 传输
  • ARP攻击代码(ARP欺骗)

    一 ARP攻击 ARP欺骗攻击原理 xff1a ARP欺骗攻击建立在局域网主机间相互信任的基础上的 比如 xff1a 假设A B C在同一个局域网中 xff0c 网关为192 168 43 1 xff0c IP地址和MAC地址分别假设如下
  • 使用wireshark抓包并分析TCP三次握手

    一 实验过程 1 TCP包抓取及分析过程 确认使用的协议 xff0c 使用HTTP服务 选择https www baidu com 作为目标地址 启动Wireshark软件 xff0c 点击开始抓包后 在浏览器地址输入https www b
  • 使用wireshark抓包并分析TCP四次挥手

    一 四次挥手 第一次挥手 xff1a xff08 FIN 43 ACK xff09 客户端发送FIN 43 ACK包给服务端 xff0c 用来关闭客户端到服务器的数据传送 此时客户端进入FIN WAIT 1状态 第二次挥手 xff1a AC
  • TR-069协议介绍

    一 概念 关于TR 069 协议命名 TR 069 全称 Technical Report 069 是由DSL Forum xff08 一个非盈利性的全球行业联盟 致力于发展宽带网络范 xff09 其成员包括通讯 设备 计算机 网络和服务提
  • FFMPEG关键结构体——AVCodecContext

    一 AVCodecContext结构体 这是一个描述编码器上下文的数据结构 xff0c 包含了众多编码器需要的参数信息 该结构体在libavcodec avcode h中定义 二 常见变量
  • FFMPEG关键结构体——AVIOContext

    一 AVIOContext结构体 这个结构体 xff0c 是FFmpeg中有关io操作的顶层结构体 xff0c 是avio的核心 FFmpeg支持打开本地文件路径和流媒体协议的URL 该结构体在libavformat avio h中定义 二
  • 指针数组和数组指针

    一 什么是指针数组 一个数组 xff0c 若其元素均为指针类型数据 xff0c 称为指针数组 xff0c 也就是说 xff0c 指针数组中的每一个元素都存放一个地址 xff0c 相当于一个指针变量 span class token keyw
  • Symfony学习笔记之翻译组件-----translation总结

    过际化 xff08 internationalization xff0c 常被简写为i18n xff09 xff0c 是指将字符串和其他一些具有区域特征的片段 xff0c 从你的程序中提取 xff08 abstract xff09 出来 x
  • 为什么要配环境变量?path用来干什么?

    提出问题 xff1a 为什么要配环境变量 xff1f 配环境变量解决了什么 xff1f xff08 阿菜进来看哈嘛 xff09 注 xff1a 环境变量具体概念自行百度百科 概念理解 xff1a 环境变量相关概念 path路径 xff1a
  • Ubuntu18.04无wifi图标安装Realtek RTL8111/8168/8411网卡驱动详解

    这是本人第一次写博客 xff0c Ubuntu系统网卡驱动问题也已经遇到过两次了 xff0c 本次写下博客作为记录 xff0c 希望对遇到同样问题的同学有所帮助 电脑 xff1a 联想E14 系统 xff1a Ubuntu18 04 使用网
  • ROS echo 命令出现报错Cannot load message class for .... Are your messages built?解决办法

    1 把别人录制的bag包拿到自己的系统环境中echo某个topic想查看内容 xff0c 键入echo命令后弹出Are your messages built 错误 xff0c 原因 xff1a 没有在自己的工作空间下的devel incl
  • Pixhawk---基于NSH的Firmware开发与调试

    xfeff xfeff 版权声明 xff1a 本文为博主 原创 文章 xff0c 未经博主允许可以转载 xff0c 注明博客出处 xff1a http blog csdn net FreeApe 目录 43 相关知识了解 1 Nuttx系统
  • Ubuntu18.04安装Terminator后切换回默认终端

    step1 打开一个终端 xff0c 键入以下命令 xff1a sudo update alternatives config x terminal emulator step2 输入你的密码 xff0c 会看到可选项 xff0c 选择 u
  • Ubuntu 安装Cmd Markdown

    Step1 官网下载压缩包 https www zybuluo com cmd Step2 解压缩包 span class token function tar span xvf cmd markdown linux64 tar gz sp
  • Ubuntu20.04 Firefox浏览器设置暗黑主题

    Ubuntu20 04 Firefox浏览器设置暗黑主题 浏览器右上角点击三横线 xff0c 选择扩展 xff0c 搜索Dark Reader 安装并启用即可
  • ROS运行Rviz显示Marker基本形状,修改FixedFrame后无显示问题解决

    终端运行Rviz报错如下图所示 WARN 1667616309 306792325 Invalid argument pub shapes passed to canTransform argument source frame in tf
  • C++类外写构造函数实现编译报错:definition of implicitly-decleared ‘函数名’

    原报错代码 class Building class GoodGay public void visit Building building class Building friend class GoodGay public Buildi
  • C++ vs2017 http简单post/get请求

    文章参考 xff1a https blog csdn net u014049599 article details 79998674 一 编写 HttpRequest h 文件 pragma once include lt string g