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

2023-05-16

目录

  • HTTP请求报文解析
  • HTTP响应报文解析
  • C++实现http发起GET请求

HTTP(Hyper Text Transfer Protocol,HTTP) 超文本传输协议,是一个简单的请求-响应协议。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTP 是基于 TCP/IP 通信协议来传递数据的(HTML 文件、图片文件、查询结果等),默认工作在 TCP 协议 80 端口。

HTTP请求报文解析

http请求报文由3部分组成:请求行、请求头、请求体。
在这里插入图片描述

①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
③是协议名称及版本号。
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
⑤是报文体,它将一个页面表单中的组件值通过param1=value1&m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&m2=value2”的方式传递请求参数。

对照上面的请求报文,我们把它进一步分解,你可以看到一幅更详细的结构图:
在这里插入图片描述

常见的HTTP请求报文头属性
Accept -请求报文通过一个Accept报文属性告诉服务器,客户端接收什么类型的响应;Accept属性的值可以为一个或多个MIME类型的值,MIME格式:大类型/小类型[;参数]
Accept:text/plain
比如:
text/html,html文件
text/css,css文件
text/javascript,js文件
image/*,所有图片文件

Cookie --客户端的cookie就是通过这个报文头属性传给服务器端
Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C
服务端是怎么知道客户端的多个请求是隶属于一个Session呢?注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原来就是通过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的方式将会话ID附带在每个URL的后面哦)。

Referer:表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。

Cache-Control
对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。
如以下设置,相当于让服务端将对应请求返回的响应内容不要在客户端缓存:
Cache-Control: no-cache
User-Agent:浏览器通知服务器,客户端浏览器与操作系统相关信息

ser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) uChrome/69.0.3497.100 Safari/537.36

Connection:表示客户端与服务连接类型;Keep-Alive表示持久连接,close已关闭
Connection: keep-alive

Content-Length:请求体的长度

POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 11

Host:请求的服务器主机名

Content-Type:请求的与实体对应的MIME信息。如果是post请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码
Content-Type: application/x-www-form-urlencoded

Accept-Encoding:浏览器通知服务器,浏览器支持的数据压缩格式。如GZIP压缩
Accept-Encoding: gzip, deflate

Accept-Language:浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)
Accept-Language: zh-CN,zh;q=0.9

HTTP响应报文解析

HTTP的响应报文也由三部分组成( 响应行+响应头+响应体 ):
在这里插入图片描述
①报文协议及版本;
②状态码及状态描述;
③响应报文头,也是由多个属性组成;
④响应报文体,即我们真正要的“干货”。

响应状态码–和请求报文相比,响应报文多了一个’响应状态码’,它以’清晰明确’的语言告诉客户端本次请求的处理结果:
1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急…
2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。

常见的HTTP响应报文头属性
在这里插入图片描述

C++实现http发起GET请求

获取城市天气信息,打印并保存本地txt文件

#include <WinSock2.h>
#include <iostream>
#include <stdio.h>
#include <string>
DWORD g_dwErr;//用于取得错误信息
const int MAX_SIZE = 40960;//保存数组的大小
int MainWindow::dealHttp()
{
    /* 初始化 */
    WSADATA wsdata;
    WSAStartup(MAKEWORD(2, 2), &wsdata);

    const char* hostname = "www.weather.com.cn";
    struct hostent* host = gethostbyname(hostname);

    /* 初始化一个连接服务器的结构体 */
    sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(80);

    /* 此处也可以不用这么做,不需要用gethostbyname,把网址ping一下,得出IP也是可以的 */
    serveraddr.sin_addr.S_un.S_addr = *((int*)*host->h_addr_list);

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1)
    {
        cout << "socket error" << endl;
        return -1;
    }
    cout << "socket succeed" << endl;

    if (::connect(sock, (struct sockaddr*)&serveraddr, sizeof(sockaddr_in)) == -1)
    {
        g_dwErr = GetLastError();
        cout << "connect error" << endl;
        closesocket(sock);
        return -1;
    }
    cout << "connect succeed" << endl;

    /* GET请求 */
    const char* bufSned = "GET http://www.weather.com.cn/data/sk/101190101.html\r\n";

    /* 发送GET请求 */
    if (send(sock, bufSned, strlen(bufSned), 0) > 0)
    {
        cout << "send succeed" << endl;
    } else
    {
        g_dwErr = GetLastError();
        cout << "send error, 错误编号: "<< g_dwErr << endl;
        closesocket(sock);
        return -1;
    }

    /* 文件,用于把HTML源码保存起来,没什么用处,只是为了自己看一下源码而已 */
    FILE *fp;
    fp = fopen("get.txt","w");

    char BufRecv[MAX_SIZE] = {};
    int nLen = 0;
    string HtmlData;

    /* 开始接收数据 */
    while ((nLen = recv(sock, BufRecv, MAX_SIZE, 0)) > 0)
    {
        /* 写文件 */
        fwrite(BufRecv, 1, nLen, fp);

        /* 把数组拼接成string类型,方便下面的处理 */
        HtmlData += BufRecv;
    }

    printf("BufRecv=%s\n",BufRecv);

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

C++实现http发起GET/POST请求 的相关文章

随机推荐

  • OSPFv3中LSA详解(六)——Type3类LSA详解

    今天继续给大家介绍OSPFv3中LSA变化 xff0c LSA的变化时OSPFv3相对于OSPFv2的一大重大改变 xff0c 本文的主要内容是OSPFv3中变化的第三类LSA的详解 阅读本文 xff0c 您需要有一定的OSPF基础知识 x
  • OSPFv3中LSA详解(七)——Type4类LSA详解

    今天继续给大家介绍OSPFv3中LSA变化 xff0c LSA的变化时OSPFv3相对于OSPFv2的一大重大改变 xff0c 本文的主要内容是OSPFv3中变化的第四类LSA的详解 阅读本文 xff0c 您需要有一定的OSPF基础知识 x
  • KVM详解(六)——KVM虚拟机快照

    今天继续给大家介绍Linux运维相关知识 xff0c 本文主要内容是KVM的快照 一 KVM快照简介 KVM支持对虚拟机创建快照 xff0c 但是前提是该虚拟机镜像不可以是raw格式 xff0c 而应该是qcow2格式 但是 xff0c 如
  • Docker详解(十五)——Docker静态IP地址配置

    今天继续给大家介绍Linux运维相关知识 xff0c 本文主要内容是Docker静态IP地址配置 一 安装Docker桥接网络 在前文Docker详解 xff08 十四 xff09 Docker网络类型详解中 xff0c 我们讲解了Dock
  • 计算机硬盘备份和恢复解决方案

    问题背景 xff1a 项目需要提供一份系统使用的计算机硬盘备份和恢复方案 xff0c 方便计算机软硬件故障后快速的恢复系统 之前项目使用的工具是Macrium reflect工具 xff0c 但这个工具现在收费了 xff0c 而且功能比较多
  • Python函数详解(一)——函数的定义、调用及变量

    今天继续给大家介绍Python相关知识 xff0c 本文主要内容是Python函数的定义 调用及变量 一 Python函数的定义与调用 在Python中 xff0c 如果我们要反复的进行一种相同或者类似的代码 xff0c 那么我们就可以将这
  • vscode SSH 保存密码自动登录服务器vs code

    先在win local mac 上拿到公钥和私钥 xff0c 然后再把这公钥copy 进服务器 让ssh 身份认证转化为秘钥认证 xff08 mac也是一样的 xff09 1 创建 RSA 密钥对 第一步是在客户端机器 xff08 通常是您
  • 普罗米修斯

    普罗米修斯 xff08 Prometheus xff09 概述 Prometheus是一套开源的监控 报警 时间序列数据库的组合 xff0c 起始是由SoundCloud公司开发的 从2016年加入CNCF xff0c 2016年6月正式发
  • ROS-mavros-PX4加速度控制

    要写的飞控算法本来的输入是roll pitch以及推进力 xff0c 由于PX4不支持输入具体大小的推进力 xff0c 改用三方向加速度 xff08 可用旋转矩阵进行变换 xff09 进行控制 但是PX4的setpoint accel实际控
  • C# 委托(Delegate)与事件(Event)、Func与Action

    一 委托 1 概念 xff1a 从内存角度看 xff0c 委托是一个存储方法的容器 xff0c 当使用该容器时 xff0c 会把容器里面的方法全部执行一遍 xff0c 容器里面的方法可增 43 61 可减 61 从IL Microsoft中
  • STM32 UART串口通信IDLE空闲中断的使用步骤

    参考了各路大神的资料 xff0c 蒙蔽了半天 xff0c 终于学会了 xff0c 记录一下 xff0c 以后忘了可以回来复习参考 一 首先在stm32cube中配置打开对应uart串口的中断 二 工程main函数调用 HAL UART EN
  • 三大通信协议(1)UART

    目录 一 UART通信协议简介 二 UART通信时序 三 UART RS232 TTL关系阐述 1 简介 2 电平转换 四 实例 1 程序代码 2 仿真验证 总结 一 UART通信协议简介 UART xff08 Universal Asyn
  • CAD难学吗?

    首先 xff0c CAD程序不容易学习 这些程序不像学习Microsoft Word或Excel 大多数CAD应用程序都有较高的学习曲线 一些参数和3D CAD应用程序的学习曲线相当陡峭 由于它们的复杂性 xff0c 学习的承诺会更长 CA
  • 安卓strings.xml文件中的msgid的作用__2019.09.12

    lt string name 61 34 name 34 msgid 61 34 012345678912345 34 gt 34 name Name 34 lt string gt 是系统返回信息的标识id这个信息的唯一性 xff0c 你
  • RealSense SDK编译

    0 uname r 查看linux的内核版本 1 xff0c ls l dev sda 查看USB设备的设备文件 2 sudo dmesg tail n 50 查看是否能检测到相机 3 查看 librealsense doc install
  • Linux-磁盘管理

    第14章 Linux系统管理 磁盘管理 第14章 Linux系统管理 磁盘管理 1 磁盘的基本概念 2 磁盘的基本结构 3 磁盘的预备知识 4 磁盘基本分区Fdisk 5 磁盘基本分区Gdisk 6 磁盘挂载方式Mount 7 虚拟内存Sw
  • 网络---数据链路层

    数据链路层 一 数据链路层的信道类型 1 点对点信道 这种信道使用一对一的点对点通信方式 2 广播信道 这种信道使用一对多的广播通信方式 xff0c 因此过程比较复杂 xff0c 广播信道上连接的主机很多 xff0c 因此必须使用专用的共享
  • 第二讲:双目vio视觉前端以及后端重投影残差

    双目vio视觉前端以及后端重投影残差 vins双目 本次主要讲解vio双目系统的视觉前端部分和后端融合的重投影残差部分 xff0c 以vins切入做为分析 xff0c 并赋代码注释解析 主要包含以下五部分内容 xff11 xff09 双目特
  • Eigen 中Geometry (几何模块)

    该代码源于 视觉SLAM十四讲 Eigen 中Geometry xff08 几何模块 xff09 主要操作有旋转向量和旋转矩阵之间的转换 xff1b 欧拉角 xff08 旋转矩阵变欧拉角 xff09 xff1b 欧式变换 xff08 旋转
  • C++实现http发起GET/POST请求

    目录 HTTP请求报文解析HTTP响应报文解析C 43 43 实现http发起GET请求 HTTP xff08 Hyper Text Transfer Protocol xff0c HTTP xff09 超文本传输协议 xff0c 是一个简