C++ 实现 发送HTTP Get/Post请求

C++中的HTTP协议 1、HTTP Hyper Text Transfer Protocol(超文本传输协议)。是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的H... 阅读详情
AI摘要

本文介绍了如何使用C++实现HTTP的Get和Post请求,详细解释了HTTP请求的基本组成部分,并提供了具体的代码实例。

1、简述

最近简单看了一下关于HTTP请求方面的知识,之前一直用Qt来实现,有专门HTTP请求的QNetworkAccessManager类来处理,实现也比较简单,这里主要讲解一下用C++代码来实现HTTP 的Get/Post请求。

一个HTTP请求报文由请求行(request line)、请求头(header)、和请求数据3个部分组成,注意请求头部分和请求数据中间需要加上“\r\n”。下图给出了请求报文的一般格式。

这里写图片描述

(1)请求行

请求行包括请求方法、URL、和HTTP协议版本三个部分。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。

(2)请求头部

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

(3)关于请求头与请求数据中间的空行

请求头之后是一个空行,需要添加 回车符和换行符——“\r\n”,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。

(4)请求数据

请求数据用于Post方法中。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

2、代码之路

发送Get请求

BOOL GetIpByDomainName(char *szHost, char* szIp)
{
	WSADATA        wsaData;
	
	HOSTENT   *pHostEnt;
	int             nAdapter = 0;
	struct       sockaddr_in   sAddr;
	if (WSAStartup(0x0101, &wsaData))
	{
		printf(" gethostbyname error for host:\n");
		return FALSE;
	}

	pHostEnt = gethostbyname(szHost);
	if (pHostEnt)
	{
		if (pHostEnt->h_addr_list[nAdapter])
		{
			memcpy(&sAddr.sin_addr.s_addr, pHostEnt->h_addr_list[nAdapter], pHostEnt->h_length);
			sprintf(szIp, "%s", inet_ntoa(sAddr.sin_addr));
		}
	}
	else
	{
		// 		DWORD  dwError = GetLastError();
		// 		CString  csError;
		// 		csError.Format("%d", dwError);
	}
	WSACleanup();
	return TRUE;
}

void sendGetRequest()
{
	 //开始进行socket初始化;
    WSADATA wData;  
    ::WSAStartup(MAKEWORD(2,2),&wData);  
      
    SOCKET clientSocket = socket(AF_INET,1,0);      
    struct sockaddr_in ServerAddr = {0};  
    int Ret=0;  
    int AddrLen=0;  
    HANDLE hThread=0; 
	
	char *bufSend = "Get /check?+参数 HTTP/1.1\r\n"  
		"Connection:Keep-Alive\r\n"
		"Accept-Encoding:gzip, deflate\r\n"  
		"Accept-Language:zh-CN,en,*\r\n"  
		"host:www.baidu.com\r\n" 
		"User-Agent:Mozilla/5.0\r\n\r\n";

	char addIp[256] = {0};
	GetIpByDomainName("www.baidu.com" , addIp);
    ServerAddr.sin_addr.s_addr = inet_addr(addIp);  
    ServerAddr.sin_port = htons(80);;  
    ServerAddr.sin_family = AF_INET;  
    char bufRecv[3069] = {0};  
    int errNo = 0;  
    errNo = connect(clientSocket,(sockaddr*)&ServerAddr,sizeof(ServerAddr));  
    if(errNo==0)  
    {  
        //如果发送成功,则返回发送成功的字节数;
        if(send(clientSocket,bufSend ,strlen(bufData),0)>0)  
        {  
            cout<<"发送成功\n";;  
        }  
        //如果接受成功,则返回接受的字节数;
         if(recv(clientSocket,bufRecv,3069,0)>0)  
         {  
 			cout<<"接受的数据:"<<bufRecv<<endl;  
         }  
    }  
    else  
    {  
        errNo=WSAGetLastError();  
    }  
    //socket环境清理;
    ::WSACleanup();  
}

发送Post请求

// post请求只需将上面的代码替换一下就可以使用
char *bufSend = "POST /check 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:114\r\n"
		"Content-Type:application/x-www-form-urlencoded; charset=UTF-8\r\n"
		"host:tmalarm.vemic.com\r\n"
		"User-Agent:Mozilla/5.0\r\n\r\n"
		"请求数据\r\n\r\n";

Post 请求也可以将请求数据写在请求行中,跟Get请求一样。


关于是否成功发送 Get/Post 请求

我们可以借助抓包工具看 我们发送的请求是否成功 ,可以去网上下载 HttpAnalyzerStdV7软件进行抓包,由返回的结果得出是否请求成功。

这里写图片描述


关于发送请求中 请求数据或者请求参数带 中文字符 出现乱码

我们程序中编码格式一般为Unicode编码,与HTTP服务器(UTF-8)所用编码不一样,这里就需要给中文字符转换编码格式。关于Unicode 编码与 UTF-8编码问题 可以看一下这篇文章 C++中 Unicode 与 UTF-8 编码互转 。

char *bufSend = "Get /check?&name=%s&password=%s HTTP/1.1\r\n"  
		"Connection:Keep-Alive\r\n"
		"Accept-Encoding:gzip, deflate\r\n"  
		"Accept-Language:zh-CN,en,*\r\n"  
		"host:www.baidu.com\r\n" 
		"User-Agent:Mozilla/5.0\r\n\r\n";
		
CString cStrName = L"前行中的小猪";
const char* cName;
// UnicodeToUtf8方法将Unicode编码转为UTF-8格式。 
cName = UnicodeToUtf8(cStrName);
char* passWord = "123456";

char bufData[400] = {0};
sprintf_s(bufData , 400 , bufSend , cName , passWord);

//这里最终将中文转为UTF-8格式的结果保存在 bufData 数组中。
// Unicode 转 UTF-8
char* UnicodeToUtf8(const wchar_t* unicode)
{
    int len;
    len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
    char *szUtf8 = (char*)malloc(len + 1);
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
    return szUtf8;
}
C++中的Http Post请求 client.request(request).then([](web::http::http_response response) // 发送请求并异步等待响应。 阅读详情

相关推荐

C++:使用POST请求进行编程

在上面的代码中,我们使用CURL库来执行HTTP POST请求。在这个示例中,我们将"data=example_data"作为POST请求的数据发送给服务器。在C++中,我们可以使用HTTP POST请求来与网络上的服务器进行通信。在本文中,我将向您展示如何在C++中编写一个简单的程序来执行HTTP POST请求,并获取服务器的响应。请注意,这只是一个简单的示例,用于演示如何使用C++和libcurl库执行HTTP POST请求。在实际应用中,您可能需要处理更复杂的HTTP请求和响应,以及错误处理等情况。

ScriptCharm的博客 1133

C++实现http发起GET/POST请求

目录HTTP请求报文解析HTTP响应报文解析C++实现http发起GET请求 HTTP请求报文解析 http请求报文由3部分组成:请求行、请求头、请求体。 ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服

weixin_40355471的博客 1万+

HTTP/HTTPS 双实现:curl 与 WinHTTP 请求实战

HTTP 与 HTTPS 是客户端网络请求的基础协议,GET/POST 决定参数位置、幂等语义与缓存重试行为,HTTPS 则在 TCP 之后通过 TLS 握手完成证书校验和会话密钥协商。理解报文边界与连接建立过程,能帮助开发者快速定位证书错误、超时重试、Content-Length 不匹配等联调问题。对 Windows 桌面端和跨平台客户端而言,curl 与 WinHTTP 是两条常见实现路径,前者便于命令行基线与 libcurl 复用,后者可复用系统证书存储和代理配置。围绕同一组 GET/POST 语义做

weixin_31292729的博客 281

c++中如何接收和发送http请求

主要是用于c++进行http的访问,请求接收与发送数据,使用工具为winhttp第三方库。

weixin_44970932的博客 7897

curl与WinHTTP实战:Windows下POST/GET与HTTPS请求全解析

HTTP与HTTPS是网络通信的基础协议,GET用于获取数据,POST用于提交数据,HTTPS则通过TLS加密保障传输安全。在Windows开发中,curl和WinHTTP是两种常用的HTTP客户端实现方式。curl跨平台且命令行调试便捷,适合快速验证与自动化脚本;WinHTTP作为Windows原生API,无需第三方依赖,适合桌面应用与系统服务。理解两者的请求构造、HTTPS证书校验、连接复用及超时控制等机制,能显著提升接口联调效率与程序稳定性。本文深入对比curl与WinHTTP在POST/GET请求、

weixin_29204749的博客 307

中国高质量夜间灯光数据

中国高质量夜间灯光数据是CnOpenData与吉林高分遥感应用研究院有限公司合作的数据库 ,基于多源夜间灯光卫星遥感影像,经过科学手段对数据进行降噪、修正、分析统计,以年度、月度为更新频率,以省市县三级行政区划作为统计单元,制作高质量夜间灯光数据。

Sunny9qx的博客 3311

C++实现发送HTTP Get/Post请求

【代码】C++实现发送HTTP Get/Post请求。

阿杰的博客 297

中国银行信息科技岗位笔试

收到笔试只剩四天了,收集的资料,后续会更新

weixin_46050242的博客 4596

C/C++ HTTP,HTTPS实现GET和POST请求

C/C++ HTTP,HTTPS实现GET和POST请求 HTTP GET和POST 实现过程 HTTP协议是在TCP基础上,加上HTTP协议头实现的 #include <QCoreApplication> #include <qglobal.h> #include <stdio.h> #include <stdlib.h> #include &lt...

weixin_41079531的博客 8106

手把手教你用LcmSim+TakeDotLib打造完美LCD显示效果(附12x12汉字配置模板)

本文详细介绍了如何使用LcmSim模拟器与TakeDotLib标准字库工具优化LCD显示效果,包括字体选择、字库生成和实体设备验证。通过12x12汉字与8x16 ASCII的黄金比例配置,帮助开发者解决嵌入式开发中的显示难题,提升用户体验。附赠12x12汉字配置模板,可直接用于项目。

weixin_29205061的博客 137

保姆级教程:从零到飞,用QGC地面站搞定PX4无人机全流程配置(含避坑指南)

本文提供了一份详细的QGC地面站使用教程,指导用户从零开始配置PX4无人机,涵盖固件烧录、传感器校准、遥控器设置及航点规划等关键步骤,并包含实用的避坑指南,帮助新手顺利完成首飞。

weixin_30329623的博客 221

C++:C语言实现HTTP的GET和POST请求例程参考

C++:C语言实现HTTP的GET和POST请求 阅读目录   HTTP请求和IP/TCP   实现GET请求   实现POST请求:   参考: 回到顶部   HTTP请求和IP/TCP   所谓的HTTP协议是基于IP/TCP协议的, 所以要获取远端的html数据只要创建socket对象就足够了;   HTTP是基于IP/TCP加上了网络请求的固...

weixin_30686845的博客 849

AUTOSAR/汽车行业

AUTOSAR架构及汽车产业链相关介绍

m0_54254513的博客 1万+

使用libcurl请求https的get/post

最近有个需求,需要用c++请求下我自己的服务器,周末看了一下怎么发起http请求。

yeshen.org 1664

Fluent UDF实战:除了速度入口,你的DEFINE_PROFILE宏还能搞定这些边界条件(温度、组分、壁面接触角全解析)

本文深入解析Fluent UDF中DEFINE_PROFILE宏在复杂边界条件中的高阶应用,涵盖温度场、组分浓度和壁面接触角等关键场景。通过实战代码示例,展示如何实现空间梯度温度场、动态组分控制和接触角动态调整,助力CFD工程师突破标准界面限制,提升仿真精度和效率。

weixin_28688385的博客 451

inferCNV包安装问题及解决办法

InferCNV是一个由broad研究所开发的,利用单细胞转录组数据分析肿瘤细胞拷贝数变异(CNV)的工具。基本思路是在整个基因组范围内,通过计算肿瘤细胞关于参考的“正常”细胞的相对表达,利用滑窗思想对邻近的基因相对表达,计算拷贝数。 先贴一个官方安装说明: 官方infercnv安装说明 安装infercnv包: if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager:

m0_51042606的博客 6803

C/C++ Linux网络编程10 - http协议

本文介绍了Linux网络编程中服务器设计流程和HTTP协议实现。主要内容包括:1)服务器端基本流程(socket、bind、listen等系统调用)及其在OSI模型中的层次划分;2)HTTP协议详解,包括URL结构、请求/响应格式、状态码分类、常见头部字段和请求方法;3)代码验证部分展示了如何构建简单的HTTP响应,并对比了GET和POST方法在参数传递方式、数据量限制和安全性方面的差异。文章通过ReactorTCP服务器示例演示了HTTP请求的接收处理和响应生成过程。

yzc的博客 1196

WiFi偏门协议(四):增强的传输机制802.11aa

区分Unicast和Multicast的优先级,以及设定不同的重传次数,以细化EDCA机制。 SCS(StreamClassification Service) 如上图,在VI,VO内各自又增加了一个queue, 对应不同的MAC header。VI和VO内的两个queue可以分别对应UC和MC。这样就提供了同一个AC内的更细粒度的优先级区分。当然还可以使用Drop Eligibility Indication子域来区分不同的重传次数。 改善Multicast数据传...

reekyli的专栏 1791

QT与Spring Boot通信:实现HTTP请求的完整指南

本文详细介绍了如何实现QT与Spring Boot之间的HTTP通信。通过Spring Boot搭建REST API后端,提供用户管理接口;QT前端使用网络模块发送GET/POST请求,处理响应数据。文章涵盖环境准备、后端API开发、QT网络请求实现、UI设计以及跨域、SSL等常见问题的解决方案。这种前后端分离架构结合了QT的跨平台界面能力和Spring Boot的高效后端开发,为开发者提供了一套完整的桌面应用通信方案。

软件科学-郝学胜 1724

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

curl库实现get及post请求

#pragma once #include &amp;lt;map&amp;gt; #include &amp;lt;string&amp;gt; class CHttpHelp { public: CHttpHelp(void); ~CHttpHelp(void); static void InitCURL(); static void CleanupCURL(); std::st...

Timeinsist的博客 916

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C/C++ http协议发送字段,文件,单个和多张图片

关于c/c++网络编程,无论在linux还是windows,要说到自由性,和安全性,socket无疑是比较好的!对于socket,因为它的传输协议只有两种tcp和udp,属于网络层,这里我们不去重点讨论。    关于应用层协议http,如何用C/C++的socket来实现数据传输和下载呢? 1. http是超文本协议,用在html文件中,那么对于html是如何传输...

u011555996的博客 2339

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c java http,【MFC】封装CHttpClient类实现HTTP请求

// HttpClient.cpp : 定义 DLL 的初始化例程。//#include "stdafx.h"#include "HttpClient.h"#ifdef _DEBUG#define new DEBUG_NEW#endifCHttpClient::CHttpClient(LPCTSTR strAgent){m_pSession = new CInternetSession(strAg...

weixin_30844407的博客 300

简单HTTP请求(POST/GET)

HTTP请求(GET/POST)

zhp优快云921011的博客 445

网络编程之http客户端(基于libcurl发送POST、GET (1)

基于libcurl封装http客户端接口,发送POST、GET、PUT、DELETE请求,上传或下载文件,C、C++编程语言可用。

2401_84003809的博客 744

C++实现http协议

C++实现http协议,数据接收逻辑

qq_26400055的博客 497
上一篇: C++中 Unicode 与 UTF-8 编码互转
下一篇: Qt 之 去除窗口部件被选中后的焦点虚线框
前行中的小猪
前行中的小猪 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 4万+粉丝 134原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值