QT客户端发送HTTP请求此时服务器到底收到了哪些数据?

一个Http请求包括

请求行 请求头 空行 请求体 

下面是示例: 1,2,3,4分别代表上面的四个部分,我只是做了一些解析,具体可以结合代码

1. post / HTTP/1.1

2.GET请求头包括Host(主机名),user-agent(客户端标识符),connection:keep-alived长连接方式

2.如果是Post请求,还包含Content-Length Content-Type字段,这些字段QT中发送的时候都可2.以自己设定,也可以使用默认的,使用setheader设置预定义的这些字段,使用setRawHeader可以任意设定k-val;

3.空行

4.json数据/html数据/文本数据

QT客户端使用HTTP请求发送

下面代码在构造的时候向服务器发送了HTTP请求,服务器只需要准备一个套接字读取数据即可,

这样就知道了服务器收到哪些数据,以及后续应该这么解析这个HTTP请求。

下面的代码中,使用setHeader和setRawHeader可以设置请求的一些参数,不设定的话默认也会生成一些参数,比如Host,,user-agent,connection这些字段。可以自己更改代码然后查看服务器的变化。

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include<QJsonDocument>
#include<QJsonObject>
#include<QUrl>
#include<QDebug>class HttpClient : public QObject
{Q_OBJECTpublic:HttpClient(QObject *parent = nullptr) : QObject(parent) {// 创建 QNetworkAccessManager 实例manager = new QNetworkAccessManager(this);// 连接信号槽,处理请求完成的响应connect(manager, &QNetworkAccessManager::finished, this, &HttpClient::onFinished);// 构造 HTTP 请求QUrl url("http://192.168.31.245:8080");  // 示例 URLQNetworkRequest request(url);// request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");//request.setHeader(QNetworkRequest::ContentLengthHeader,"13");request.setRawHeader("User-Agent", "MyApp/1.0");request.setRawHeader("HH--YY--PP", "i am fun");// 构建 JSON 数据QJsonObject json;json["title"] = "foo";json["body"] = "bar";json["userId"] = 1;QJsonDocument jsonDoc(json);QByteArray jsonData = jsonDoc.toJson();// 发送 POST 请求manager->post(request, jsonData);//manager->get(request);}private slots:// 处理服务器的响应void onFinished(QNetworkReply *reply) {if (reply->error() == QNetworkReply::NoError) {// 读取服务器响应的数据QByteArray responseData = reply->readAll();qDebug() << "Response data:" << responseData;} else {// 处理请求中的错误qDebug() << "Error:" << reply->errorString();}// 释放资源reply->deleteLater();}private:QNetworkAccessManager *manager;  // HTTP 管理器
};

服务器代码

下面的代码在本地ubantu 虚拟机运行,这里只需要实现read数据就可以,因为这里主要验证的是服务器收到的数据有哪些?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>   // 包含网络地址结构和函数
#include <sys/socket.h>  // socket 相关函数#define PORT 8080  // 定义服务器的监听端口
#define BUFFER_SIZE 5555// 定义缓冲区大小int main() {int server_fd, new_socket;  // 服务器的 socket 文件描述符和新连接的 socketstruct sockaddr_in address;  // 存储服务器地址int addrlen = sizeof(address);  // 地址长度char buffer[BUFFER_SIZE] = {0};  // 用于接收消息的缓冲区const char *message = "Hello from server";  // 服务器的响应消息// 创建 socket 文件描述符if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 服务器地址结构配置address.sin_family = AF_INET;  // IPv4address.sin_addr.s_addr = INADDR_ANY;  // 绑定到所有可用的网络接口address.sin_port = htons(PORT);  // 转换端口为网络字节序// 绑定 socket 到指定端口和地址if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");close(server_fd);exit(EXIT_FAILURE);}// 监听端口,最大等待队列长度为 3if (listen(server_fd, 3) < 0) {perror("listen failed");close(server_fd);exit(EXIT_FAILURE);}printf("Server is listening on port %d\n", PORT);// 接受来自客户端的连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept failed");close(server_fd);exit(EXIT_FAILURE);}// 从客户端接收数据int valread = read(new_socket, buffer, BUFFER_SIZE);printf("Message from client:\n%s", buffer);// 关闭 socketclose(new_socket);close(server_fd);return 0;
}

收到的数据如下

  request.setRawHeader("User-Agent", "MyApp/1.0");request.setRawHeader("HH--YY--PP", "i am fun");

上面的代码可以任意设定请求头的字段,更加的灵活。

将QT注释的代码取消注释,即可更新ConTent-type字段,Lenth字段没设定的话可以自动填充,一般不用自己设定,只需要设定ConTent-type来告诉服务器请求头是什么类型的数据即可。

总结

        最后服务器收到这些数据,根据请求行的URI,这里是/路径下,如果是get请求,根据后面的参数即可找到对应的文件,比如是一个html网页的静态页面,直接返回这个静态的HTML页面就可以。如果是Post请求,那么就读取请求体的数据来做后续的业务处理,比如客户端的登录,解析出用户名,密码(可以自己加密)等去查询数据库,最后封装响应返回即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149374.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++类和对象(中)【下篇】

&#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏: C专栏 目录 赋值运算符重载 运算符重载 赋值运算符重载 日期类实现 运算符重载<和运算符重载 运算符重载进行复用 运算符重载< 运算符重载> 运算符重载> 运算符重载! 获取某年某月的天数…

解决方案 | 镭速助力动漫游戏行业突破跨网文件交换瓶颈

在数字化浪潮推动下&#xff0c;动漫游戏行业蓬勃发展。随着高清技术的普及和云游戏的兴起&#xff0c;动漫游戏行业对动画的画质要求越来越高&#xff0c;数据量呈现爆炸式增长。然而&#xff0c;行业内的跨网文件交换难题也日益凸显&#xff0c;成为制约行业发展的瓶颈。 行业…

pyqt瀑布流布局

最近研究瀑布流布局&#xff0c;发现都是收费的&#xff0c;所以只能自己写算法写布局。 所以啥都不说直接上代码 ImageLabel 参考 pyqt5 QLabel显示网络图片或qfluentwidgets官网 代码 import math import sys from pathlib import Pathfrom PyQt5.Qt import * from qflue…

erlang学习:Linux命令学习4

顺序控制语句学习 if&#xff0c;else对文件操作 判断一个文件夹是否存在&#xff0c;如果存在则进行删除&#xff0c;如果不存在则创建该文件夹&#xff0c;并复制一份该脚本后&#xff0c;删除该脚本 if [ -d "/erlangtest/testdir"]; then echo "删除文件夹…

JavaWeb--小白笔记07-2:超链接以及servlet对表单数据的完整处理

一.超链接 Html使用标签<a></a>来设置超链接&#xff0c;<a>有一个属性href"" 必须加进去&#xff0c;里面就是链接地址 注意&#xff1a;链接里必须包含https://前缀 <a></a>里面可以是一个字&#xff0c;一个词或者一副图...点击…

27 C 语言标准库 <stdio.h> 中的两个重要字符串函数:sprintf、sscanf

目录 1 sprintf 1.1 函数原型 1.2 功能说明 1.3 案例演示 1.4 注意事项 2 sscanf 2.1 函数原型 2.2 功能说明 2.3 案例演示 2.4 注意事项 1 sprintf 1.1 函数原型 sprintf 函数是 C 语言标准库中的一个函数&#xff0c;用于将格式化的数据写入字符串。其函数原型定义…

【软件测试】详解测试中常用的几种测试方法

目录 一、集成测试二、 系统测试三、验收测试四、回归测试 总结 一、集成测试 术语 集成测试是继组件测试之后的又一个层次。集成测试假定交给这个层次的测试对象已经经过了组件测试&#xff0c;并且任何组件内部的缺陷都已经尽可能地被纠正。 集成 开发人员、测试人员和专…

【裸机装机系列】14.kali(ubuntu)-linux装机在分区时采用manual手动形式该怎么做

推荐阅读&#xff1a; 1.kali(ubuntu)-为什么弃用ubuntu&#xff0c;而选择基于debian的kali操作系统 如果在装机的时候选则了manual手动模式&#xff0c;可以根据以下步骤一步步做: 1> 在“partition disks”这个地方选择了manual,也就是手动自己分区的方式 点击"c…

大模型框架 LangChain 介绍

文章目录 langchain介绍安装依赖大模型类别千帆大模型案例常见问题 langchain介绍 是一个开源大语言模型框架&#xff0c;本身不提供大模型算法&#xff0c;只提供对接大模型算法平台的接口&#xff08;模型包裹器&#xff09;&#xff1b;langchain官网v0.2&#xff0c;内部涉…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建斗地主

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建斗地主 华为云端口放行 服务器放行对应端口8078 Docker安装并配置镜像加速 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、docker安装 yum install -y docker-ce3、验证 Dock…

问请问请问2312123213123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

后台管理系统开箱即用的组件库!!【送源码】

今天给大家推荐几款的后台管理系统开箱即用的组件库&#xff0c;基于ElementUI二次封装&#xff0c;开发必备 Headless UI Headless UI 是一款出色的前端组件库&#xff0c;专为与 Tailwind CSS 集成而设计。一组完全无样式、完全可访问的 UI 组件&#xff0c;可以自由的引入…

使用Docker和cpolar在Linux服务器上搭建DashDot监控面板

使用Docker和cpolar在Linux服务器上搭建DashDot监控面板 前言环境准备安装Docker下载Dashdot镜像 部署DashDot应用本地访问DashDot服务安装cpolar内网穿透固定DashDot公网地址结语 前言 在这个数字化飞速发展的时代&#xff0c;服务器作为支撑各种应用和服务的基础设施&#xf…

Unity进阶之C#知识补充

概述 Unity跨平台的基本原理 了解.Net相关知识 Unity跨平台的基本原理&#xff08;Mono&#xff09; Unity跨平台的基本原理&#xff08;IL2CPP&#xff09; IL2CPP 模式可能存在的问题处理 报错的话就去下载 用到的测试类 C#版本和Unity的关系 C#各版本新功能和语法 C# 1~4 功…

【模型】感知器

感知器是最早的人工神经网络之一&#xff0c;也是现代深度学习的基础之一。 1. 感知器&#xff08;Perceptron&#xff09; 1.1 定义与功能 感知器是一种线性二分类模型&#xff0c;旨在模拟生物神经元的基本功能。它通过对输入特征进行加权求和&#xff0c;并应用激活函数来…

chapter17-多线程基础——(自定义泛型)——day20

580-程序进程线程 581-并发并行 并发和并行也可以同时进行 582-继承Thread创建线程 583-多线程机制 主线程和子线程交替执行 单核&#xff1a;两个线程并发 多核&#xff1a;两个线程并行 主线程结束&#xff0c;不是说进程就结束&#xff0c;进程要等所有线程结束 584-为什…

如何破解西门子博途V19里的密码设置

现在使用TIA Portal V19的工程师是越来越多了&#xff0c;V19有个显著的变化就是访问密码的设置&#xff0c;很多小伙伴忽然发现已经用了很多年的功能&#xff0c;在改动以后都不会设置了&#xff0c;那我们今天就带着您看一下如何才能在 V19 中正确的设置 S7-1500 访问密码。 …

AI论文写作可靠吗?分享5款论文写作助手ai免费网站

AI论文写作的可靠性是一个备受关注的话题。在当前的技术背景下&#xff0c;AI写作工具能够显著提高论文写作的效率和质量&#xff0c;但其可靠性和安全性仍需谨慎评估。 AI论文写作的可靠性 技术能力与限制 AI论文写作的质量很大程度上取决于用户提供的输入指令或素材的质量…

小程序面板开发教程|开发照明 Matter 面板步骤(一)

一. 前置知识 前言 出于对 Matter 标准协议及第三方设备接入的可拓展性等方面考虑&#xff0c;照明 Matter 模型面板的功能点定义会与照明的 DP 模型有所不同&#xff0c;因此本文会着重介绍照明 Matter 面板的功能点定义及与 DP 模型的区别&#xff0c;以方便面板小程序开发…

thinkphp 做分布式服务+读写分离+分库分表+负载均衡(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表负载均衡&#xff08;分区&#xff09; 引言 thinkphp* 大道至简负载均衡分布式服务一、读写分离1、读写分离的实现方式2、主从同步的三种模式2-1、异步模式&#xff08;mysql async-mode&#xff09;2-2、半同步模式&#xff08;mysql s…