0

0

Rust Actix-web如何解析XML上传 serde-xml-rs库的应用

幻夢星雲

幻夢星雲

发布时间:2026-02-09 09:42:51

|

903人浏览过

|

来源于php中文网

原创

Actix-web无法直接用web::Json处理XML请求,因其硬编码只认application/json;需手动读取body字节并用serde_xml_rs::from_reader解析,注意同步解析、字段重命名及Content-Type校验。

rust actix-web如何解析xml上传 serde-xml-rs库的应用

Actix-web 接收 XML 请求体时为何不能直接用 web::Json

因为 web::Json 内部硬编码依赖 serde_json,只认 Content-Type: application/json,且会自动拒绝非 JSON MIME 类型。XML 请求(application/xmltext/xml)会被直接拦截并返回 400 错误 —— 这不是配置问题,是类型守门员的强制策略。

必须绕过默认 extractor,手动读取原始 body 并用 serde_xml_rs 解析。

如何用 serde_xml_rs 解析 Actix-web 的 XML body?

核心步骤:禁用自动解析 → 读取完整字节流 → 用 serde_xml_rs::from_reader 解析。注意两点:一是 serde_xml_rs 不支持异步 reader,所以必须先 .await 收完全部 body;二是它默认不处理 XML 声明(如 ),但实际能容忍,无需提前 strip。

  • 确保 struct 字段加 #[serde(rename = "xxx")] 匹配 XML tag 名(大小写、中划线敏感)
  • 嵌套元素用结构体字段,文本内容用 #[serde(rename = "$value")]
  • 可选字段用 Option,缺失标签会被反序列化为 None
  • 数组用 Vec,前提是 XML 中有多个同名 tag(serde_xml_rs 自动聚合)
use serde::Deserialize;
use actix_web::{web, HttpResponse, HttpRequest, HttpError};
use serde_xml_rs;

#[derive(Deserialize, Debug)]
struct User {
    #[serde(rename = "user_id")]
    id: u32,
    #[serde(rename = "full-name")]
    full_name: String,
    #[serde(rename = "$value")]
    content: Option,
}

async fn handle_xml(req: HttpRequest, body: web::Bytes) -> Result {
    let user: User = serde_xml_rs::from_reader(body.as_ref())
        .map_err(|e| HttpError::BadRequest(e.to_string()))?;
    Ok(HttpResponse::Ok().json(user))
}

Content-Type 不匹配导致解析失败的常见表现

如果客户端发的是 text/xml,而你代码里没校验或没适配,serde_xml_rs 本身不会报 MIME 错误,但 Actix-web 可能在中间件或 CORS 预检阶段就拦掉请求。更隐蔽的问题是:某些 HTTP 客户端(如 curl)默认不带 Content-Type,此时 Actix-web 会 fallback 到 application/octet-stream,body 虽能读到,但语义已丢失 —— 你需要显式检查 req.headers().get("content-type")

Lyrics Generator
Lyrics Generator

免费人工智能歌词生成器和人工智能歌曲作家

下载
  • 推荐在 handler 开头加校验:if req.content_type() != "application/xml" && req.content_type() != "text/xml" { return Err(HttpError::UnsupportedMediaType(...)); }
  • req.content_type() 返回的是 Option,需用 .and_then(|v| v.to_str().ok()) 安全转换
  • 测试时用 curl 发送:curl -X POST -H "Content-Type: application/xml" --data-binary @input.xml http://localhost:8080/xml

为什么不用 quick-xml 替代 serde_xml_rs

serde_xml_rs 是唯一与 serde 生态无缝对接的 XML 库,支持标准 derive 宏;quick-xml 更快、更底层,但需要手写事件循环或绑定到 serdeDeserializer 实现 —— 对多数业务场景属于过度设计。除非你处理 GB 级 XML 流或需要 SAX 式逐节点处理,否则坚持用 serde_xml_rs 更稳。

另外注意:serde_xml_rs 目前不支持 namespace(如 ),若接口协议含 namespace,就得切到 quick-xml + 手动映射,这是最容易被忽略的兼容性断点。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

12

2025.12.22

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

180

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

222

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

433

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

543

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

315

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

799

2023.08.22

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

96

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号