转自个人博客

由于 QML 的 JavaScript 兼容性,我们可以直接使用 JavaScript 的 XMLHttpRequest 对象进行 HTTP 请求。QML 的 XMLHttpRequest 实现与标准浏览器的实现非常相似,但有一些限制和特殊行为需要注意。

而QML实现TCP等其他通信一般就需要借助Qt与C++的关系了,本文对此略过

1. XMLHttpRequest对象详解

1.1 属性
  • readyState:当前对象的状态码,取值如下:
    • 0 (UNSENT):未初始化,尚未调用 open()
    • 1 (OPENED):已调用 open(),但未调用 send()
    • 2 (HEADERS_RECEIVED):已接收响应头。
    • 3 (LOADING):正在接收响应体。
    • 4 (DONE):请求完成,响应数据就绪。
  • status:int,当前HTTP请求的状态码(如 200 成功,404 未找到,见3.3)。
  • statusText:string,HTTP响应的状态文本(如 “OK”、“Not Found” 等,见3.3)。只有在 readyStateDONE 时才有效。
  • responseType:string,响应内容的数据类型。
  • responseText:string,服务器的响应数据,以纯文本形式表示。仅在 responseTypetext 或未设置时有效
  • response:var,根据 responseType 解析后的响应数据(如 JSON 对象、二进制数据)。默认为 ""(空字符串),在 QML 中可以通过设置 responseType 来获取不同类型的数据。
  • responseURL:string,Qt6.6引入,实际响应的URL,如果请求被重定向,则返回最终的 URL。
  • responseXML:var,服务器的响应数据,以XML文档形式表示,仅当响应内容为XML格式时有效。
  • timeout:int,超时时间(以毫秒为单位)。如果设置,当请求超过指定时间仍未完成时会触发 ontimeout 事件。
  • withCredentials:bool,表示是否在跨域请求中发送凭据(如 Cookies)。仅在支持 CORS 的服务器上有效。
1.2 方法
  • void open(method, url, async):初始化请求。
    • method:HTTP 方法(如 GETPOSTPUT)。
    • url:请求地址(支持相对路径和绝对路径)。
    • async:是否异步(可省略,默认为 true,QML中通常不推荐设为 false)。
  • void send(data):发送请求。
    • data:获取的请求体内容(GET 请求可省略或传 null,POST 可传 FormData 或 JSON 字符串)。
  • void setRequestHeader(header, value):设置请求头(需在 open() 之后、send() 之前调用)。
  • void abort():终止当前请求。
  • string getAllResponseHeaders()
  • string getResponseHeader(headerName)
1.3 事件
  • onreadystatechange:function,函数类型,每当readyState 在几个状态中发生变化时就会触发,执行函数,用于监听请求状态。一般为其指定函数,用于指定处理各种状态变化后的事件。
  • onerror:function,函数类型,网络错误时触发(如域名解析失败),执行函数。
  • ontimeout:function,函数类型,请求超时时触发(需先设置 timeout 属性),执行函数。
  • onload:function,函数类型,请求成功完成时触发(readyState === DONEstatus === 200),执行函数。
  • onprogress:function,函数类型,上传或下载进度更新时触发(适用于大文件传输),执行函数。


2. XMLHttpRequest对象的使用

总示例如下:

function postCMD(cmd){httpRequest("http://127.0.0.1:7111/track/" + cmd, "POST", null, function(resultS, status){if(status === 200){}else{/// \todo warning message}})}function httpRequest(serverUrl, method, data, callback){var xhr = new XMLHttpRequest();xhr.onreadystatechange = function(){if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED){}else if(xhr.readyState === XMLHttpRequest.DONE){if(callback){callback(xhr.responseText.toString() ,xhr.status)}}}xhr.open(method, serverUrl);xhr.timeout = 3000;xhr.setRequestHeader("Connection", "close");if(!data){xhr.send();}else{xhr.send(data);}
}
2.1 使用XMLHttpRequest的流程
  1. 创建 XMLHttpRequest 对象。
  2. 调用 open() 配置请求。
  3. 设置请求头。(可选)
  4. 设置 responseType。(可选)
  5. 监听 onreadystatechange,处理响应。(在发送请求之前配置即可即可)
  6. 调用 void send(data) 方法发送请求并传送数据。
2.2 配置请求的基本信息和请求头
  • 使用new创建对象
  • 使用void open(method, url, async)初始化请求,指定HTTP方法和请求地址。
  • 使用void setRequestHeader(header, value)指定请求头的key和value,可累积配置。
  • 还可以指定一些其他参数,如通过设置timeout属性来设置时间限制等等。
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://127.0.0.1:12345/");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", "Bearer your_token_here");
xhr.timeout = 3000;
2.3 监听事件状态进行对应处理

在需要的时候为事件赋值函数,类似于回调函数,让在对应状态发生变化的时候触发此函数来获得想要的结果。

一般都会对readyStateonreadystatechange事件进行监听,以对请求的状态有着整体的把握。并且能在请求结束的时候,通过responseText等属性获取GET的数据等。

xhr.onreadystatechange = function() {console.log("当前 readyState:", xhr.readyState);if (xhr.readyState === XMLHttpRequest.DONE) { // 请求完成if (xhr.status === 200) { // 成功响应console.log("请求成功!");console.log("响应数据:", xhr.responseText);} else {console.error("请求失败,状态码:", xhr.status);}}
}xhr.onerror = function() {console.error("网络错误: 无法连接到服务器");
}// 对于ontimeout、onload、onprogress都是同理
2.4 发送请求

在配置完成后使用void send(data)方法发送请求并传送数据。

对于参数data,如果是 GET 请求可省略或传 null,而如果是 POST 可传 FormData 或 JSON 字符串。

// GET时候可用
xhr.send();// 通用
var data = '';
data = "...."; // 数据
xhr.send(data);


3. 进阶用法

3.1 发送 FormData(表单数据)

适用于文件上传或 multipart/form-data 格式:

 function uploadFile() {var xhr = new XMLHttpRequest();var formData = new FormData();formData.append("file", fileInput.files[0]); // 假设 fileInput 是文件选择框formData.append("comment", "QML 文件上传测试");xhr.open("POST", "https://api.example.com/upload");xhr.onreadystatechange = function() {if (xhr.readyState === XMLHttpRequest.DONE) {console.log("上传结果:", xhr.status);}};xhr.send(formData);}
3.2 处理二进制数据(如图片)

通过设置 responseType"arraybuffer",可直接获取二进制数据:

 function loadImage() {var xhr = new XMLHttpRequest();xhr.open("GET", "https://example.com/image.png");xhr.responseType = "arraybuffer";xhr.onreadystatechange = function() {if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {var byteArray = new Uint8Array(xhr.response);var imageData = "data:image/png;base64," + btoa(String.fromCharCode.apply(null, byteArray));imageElement.source = imageData; // 显示图片}};xhr.send();}
3.3 常见请求的状态码
状态码含义典型场景
200请求成功常规 GET/POST 请求
201资源已创建创建新用户、提交表单
204请求成功,但无内容DELETE 请求
301资源永久移动URL 重写
302资源临时移动登录后跳转
304资源未修改,使用缓存条件请求
400请求无效表单数据错误
401未授权需要登录
403禁止访问权限不足
404资源不存在页面或 API 路径错误
405方法不被允许不支持的 HTTP 方法
429请求过多触发速率限制
500服务器内部错误代码崩溃或数据库问题
502网关错误上游服务不可用
503服务不可用服务器维护或过载
504网关超时上游服务响应超时
3.4 跨域请求与 withCredentials

跨域请求是常见的需求,特别是在需要携带 Cookies 或认证信息时。通过设置 withCredentials 属性为 true,可以在跨域请求中发送凭据。

要注意的是,服务器必须支持 CORS(跨域资源共享),并允许 credentials,如果服务器未正确配置 CORS,可能会导致请求失败。

function makeCORSRequest() {var xhr = new XMLHttpRequest();xhr.open("GET", "https://api.example.com/data", true);xhr.withCredentials = true; // 允许跨域请求携带凭据xhr.onreadystatechange = function() {if (xhr.readyState === XMLHttpRequest.DONE) {if (xhr.status === 200) {console.log("跨域请求成功:", xhr.responseText);} else {console.error("跨域请求失败,状态码:", xhr.status);}}};xhr.send();
}
3.5 利用onprogress事件监控上传/下载进度

对于大文件下载,可以通过 onprogress 事件实时更新下载进度,并显示给用户。

function downloadFile(url) {var xhr = new XMLHttpRequest();xhr.open("GET", url, true);xhr.onprogress = function(event) {if (event.lengthComputable) {var percentComplete = (event.loaded / event.total) * 100;console.log("下载进度:", percentComplete.toFixed(2) + "%");} else {console.log("无法计算总大小,正在下载...");}};xhr.onload = function() {if (xhr.status === 200) {console.log("文件下载完成!");} else {console.error("下载失败,状态码:", xhr.status);}};xhr.onerror = function() {console.error("网络错误: 无法连接到服务器");};xhr.send();
}

类似地,对于大文件上传,也可以通过 onprogress 事件监控上传进度。

function uploadFile(fileInput) {var xhr = new XMLHttpRequest();var formData = new FormData();formData.append("file", fileInput.files[0]);xhr.open("POST", "https://api.example.com/upload", true);xhr.upload.onprogress = function(event) {if (event.lengthComputable) {var percentComplete = (event.loaded / event.total) * 100;console.log("上传进度:", percentComplete.toFixed(2) + "%");} else {console.log("无法计算总大小,正在上传...");}};xhr.onload = function() {if (xhr.status === 200) {console.log("文件上传成功!");} else {console.error("上传失败,状态码:", xhr.status);}};xhr.onerror = function() {console.error("网络错误: 无法连接到服务器");};xhr.send(formData);
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 内置反向代理(Undertow Proxy)高可用配置

引言 在微服务架构中,反向代理是一个不可或缺的组件,它负责请求转发、负载均衡、安全过滤等关键功能。 通常我们会选择 Nginx、HAProxy 等专业反向代理组件,但在某些场景下,使用 Spring Boot 内置的反向代理功能可以简化架构&am…

ClickHouse 部署

Docker 部署 1、拉取镜像 docker pull clickhouse/clickhouse-server:latest单机版本部署 编写docker-compose.yml version: 3services:clickhouse-server:image: clickhouse/clickhouse-server:22.12container_name: clickhouse-serverports:- "8123:8123"ulimit…

Fiddler中文版抓包工具如何帮助前端开发者高效调试

前端开发早已不再是“写好页面就完事”的工作。随着业务复杂度提升,前端开发者需要直面接口联调、性能优化、跨域排查、HTTPS调试等一系列和网络请求紧密相关的任务。抓包工具成为这些环节中不可替代的得力助手,而 Fiddler抓包工具 因其全面的功能和灵活…

WTL 之trunk技术学习

相比于MFC的消息机制,WTL/ATL的实现更加优雅。后者将win32 API与面向对象技术完美地结合起来,去掉了庞杂的MFC依赖,生成的软件体积更小,运行速度更快。在其中,如何将窗口函数转变为对窗口对象成员函数的调用&#xff0…

Linux——11.软件安装与包管理

Linux 与 Windows 系统在软件安装方式上的差异 Linux: Linux 通过 包管理系统(如 Debian 的 apt、Red Hat 的 yum/dnf)将软件打包为二进制安装包(如 .deb、.rpm),每个包包含程序文件、依赖关系和元数据。包管理系统负责统一管理软件的安装、更新、卸载,并自动处理依赖关…

无人机用shell远程登录机载电脑,每次需要环境配置原因

原因: 终端分为“登录 shell”和“非登录 shell”: - 登录 shell(如开机登录、远程 SSH 连接)会加载 .profile 或 .bash_profile 。 - 非登录 shell(如打开新终端窗口)会加载 .bashrc 。 - 如果环境变量…

HarmonyOS5 折叠屏适配测试:验证APP在展开/折叠状态下的界面自适应,以及会出现的问题

以下是HarmonyOS5折叠屏应用在展开/折叠状态下的UI自适应测试方案及技术实现要点: 一、核心测试维度 ‌状态连续性验证‌ 页面滚动位置保持(需通过display.on(foldStatusChange)监听状态并保存/恢复滚动位置)输入内容保留(使用…

Introduction to Software Engineering(TE)

Program Design Language 也称为:伪代码语言(Pseudo-code Language) PDL 的同类(或相关替代) 名称简介是否代码结构化流程图 (Flowchart)用图形方式描述处理逻辑✅伪代码 (Pseudo-code)通用术语,PDL就是…

DM8数据库入门到熟练

1、部署 1.1、下载 用户在安装 DM 数据库之前需要检查或修改操作系统的配置,以保证 DM 数据库能够正确安装和运行。 操作系统CPU数据库CentOS7x86_64dm8_20250506_x86_rh7_64.zip 1.2、新建 dmdba 用户 安装前必须创建 dmdba 用户,禁止使用 root 用户…

VUE3入门很简单(2)--- 计算属性

前言 重要提示:文章只适合初学者,不适合专家!!! 为什么需要计算属性? 想象你在开发一个购物车功能。当用户选择商品时,你需要: 计算商品总价根据折扣码调整价格自动更新免运费状…

IPV6概述

1. 定义 IPv6(Internet Protocol version 6)是互联网协议的第六版,设计用于替代现有的 IPv4 协议。IPv6 提供了更大的地址空间、增强的路由效率、更好的安全性以及自动配置功能,以满足现代网络的需求。 1.1 地址空间 IPv6 地址长…

量子机器学习:AI算力突破量子优势临界点?

前言 前些天发现了一个巨牛的人工智能免费学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 以下是为您撰写的第六篇CSDN深度技术解析文章,围绕前沿命题 《量子机器学习:AI算力突破量子优势临界点&…

Kerberos 深入详解:原理、认证流程与应用场景

目录 什么是 KerberosKerberos 原理解析Kerberos 认证完整流程Kerberos 应用场景常见问题与最佳实践参考资料 什么是 Kerberos Kerberos 是一种广泛应用于计算机网络中的身份认证协议,它基于对称密钥加密思想,核心目标是在不安全的网络中实现安全的身份…

mac安装node 实测可行

进入nodejs官网,选择mac,选择安装方式,选择版本即可获得安装命令 直接执行即可 具体脚本 # Download and install nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash# in lieu of restarting the shell \. "…

山石网科谈平凡对话中的咒语——提示词注入攻击与防御

现场 2026 年 4 月 25 日上午,A市 初春的街道,阳光普照,鸟语花香,V 君中午要与一个重要的客户见面, 特意预约了人气正旺的星际咖啡馆,他家主打未来科幻风,之前去过几次, 服务周到、…

SpringMVC系列(五)(响应实验以及Restful架构风格(上))

0 引言 作者正在学习SpringMVC相关内容,学到了一些知识,希望分享给需要短时间想要了解SpringMVC的读者朋友们,想用通俗的语言讲述其中的知识,希望与诸位共勉,共同进步! 本系列会持续更新!&…

Windows 环境下设置 RabbitMQ 的 consumer_timeout 参数

在 Windows 环境下设置 RabbitMQ 的 consumer_timeout 参数,可以通过临时修改或永久修改两种方式实现。以下是具体操作步骤: 一、临时修改(无需重启服务,但重启后失效) ‌通过命令行动态设置‌ 打开命令提示符&#xf…

Python 中切换镜像源

在 Python 中切换镜像源主要涉及 pip 包管理器 和 conda 环境(如 Anaconda、Miniconda) 的配置。国内访问 Python 官方源(PyPI)可能较慢,因此推荐使用国内镜像源(如阿里云、清华大学、豆瓣等)。…

深入解析拓扑排序算法:从原理到C++实现

一、拓扑排序概述 拓扑排序(Topological Sorting)是对有向无环图(Directed Acyclic Graph,简称DAG)的顶点进行排序,得到一个线性序列,使得对于图中的任意一对顶点u和v,若存在一条从u到v的路径,则u在排序结果中出现在v…

图像质量对比感悟

具体任务: 在本次任务中,我需要对比两张1080p的yuv图片的清晰度,那么如何判断呢?主要是进行了主观判断和客观psnr的判断。 psnr解释: 定义: PSNR 用于衡量 两幅图像之间的差异(通常是原始图像和…