使用Axios发送multipart/mixed请求的教程

使用Axios发送multipart/mixed请求的教程

本教程详细探讨了如何在不同JavaScript环境中构建和发送multipart/mixed类型的POST请求,特别是区分了Node.js环境中使用form-data库的便捷方式,以及在浏览器环境中手动构造请求体的复杂但必要的实现方法。文章将涵盖XML片段和二进制文件混合传输的场景,并提供具体的代码示例和注意事项。

1. 理解 multipart/mixed 与 multipart/form-data

在web开发中,当我们通过http post请求上传数据时,常常会遇到multipart类型的content-type。其中,multipart/form-data是最常见的,通常用于表单提交,浏览器会自动处理边界字符串和各部分的头部信息。然而,某些特定的api(例如,旧版或专有协议)可能要求使用multipart/mixed类型,它提供了更大的灵活性,允许在单个请求体中混合不同类型的数据(如文本、xml、json、二进制文件等),并且需要手动管理边界字符串和各部分的content-disposition、content-type等头部。

本文的目标是构建一个multipart/mixed请求,其中包含一个XML片段和一个二进制文件,其结构如下:

--boundary-stringContent-Disposition: name="request_payload"Content-Type: text/xml  --boundary-stringContent-Disposition: name="tableau_workbook"; filename="workbook-file-name"Content-Type: application/octet-stream--content-of-workbook-file----boundary-string--

2. 在 Node.js 环境中构建 multipart/mixed 请求

在Node.js环境中,可以使用form-data库来简化multipart请求的构建,即使是multipart/mixed类型也能灵活处理。该库允许我们手动指定每个部分的Content-Type,并能方便地获取请求所需的头部信息和边界字符串。

所需依赖:

{  "dependencies": {    "axios": "^1.3.4",    "form-data": "^4.0.0"  }}

示例代码:

const FormData = require("form-data");const Axios = require("axios");// 假设 XML 片段和文件内容已准备好const xmlString = `                            `;const fileContentArrayBuffer = new ArrayBuffer(1024); // 替换为实际的 ArrayBuffer 文件内容// 创建 FormData 实例const form = new FormData();// 添加第一个部分:XML 片段form.append("request_payload", xmlString, {  contentType: "text/xml", // 明确指定 Content-Type});// 添加第二个部分:二进制文件form.append("tableau_workbook", Buffer.from(fileContentArrayBuffer), { // 在 Node.js 中,Buffer 更常用  filename: "workbook-file-name.twb", // 指定文件名  contentType: "application/octet-stream", // 明确指定 Content-Type});// 创建 Axios 客户端const axiosClient = Axios.create({  baseURL: "https://your-api-base-url.com", // 替换为你的 API 基础 URL});// 发送 POST 请求async function sendMultipartMixedRequest() {  try {    const response = await axiosClient.post("sites/:siteId/workbooks", form, {      headers: {        ...form.getHeaders(), // 获取 form-data 自动生成的头部,包括 Content-Type 和边界        // 关键一步:覆盖 Content-Type 为 multipart/mixed 并使用 form-data 的边界        "Content-Type": `multipart/mixed; boundary=${form.getBoundary()}`,      },    });    console.log("请求成功:", response.data);    return response.data;  } catch (error) {    console.error("发送请求失败:", error.response ? error.response.data : error.message);    throw error;  }}// 调用函数发送请求// sendMultipartMixedRequest();

注意事项:

form-data库在append方法中允许通过第三个参数指定contentType和filename,这对于构建multipart/mixed至关重要。form.getHeaders()会返回一个包含Content-Type(通常是multipart/form-data)和边界字符串的对象。为了实现multipart/mixed,我们手动覆盖了Content-Type,并利用form.getBoundary()来获取正确的边界字符串。在Node.js中,处理二进制数据时通常使用Buffer对象。

3. 在浏览器环境中构建 multipart/mixed 请求

浏览器环境中的FormData API主要用于构建multipart/form-data请求。它会自动处理边界和每个部分的头部。要实现multipart/mixed,特别是当需要精确控制每个部分的Content-Type和Content-Disposition时,我们通常需要手动构造请求体。这涉及到将所有部分(包括边界、头部和数据)拼接成一个Blob对象。

示例代码:

import axios from 'axios'; // 假设你已安装并导入 Axios/** * 在浏览器环境中发送 multipart/mixed POST 请求 * @param {string} xmlString - 要发送的 XML 片段字符串 * @param {ArrayBuffer} fileArrayBuffer - 要发送的二进制文件内容的 ArrayBuffer * @param {string} endpointUrl - API 接口的 URL * @returns {Promise} - Axios 响应数据 */async function sendMultipartMixedInBrowser(xmlString, fileArrayBuffer, endpointUrl) {    // 1. 生成一个唯一的边界字符串    // 推荐使用随机字符串,确保与请求体内容不冲突    const boundaryString = `----WebKitFormBoundary${Math.random().toString(36).substring(2, 15)}`;    // TextEncoder 用于将字符串转换为 Uint8Array,以便与二进制数据一起处理    const encoder = new TextEncoder();    // 存储所有请求体部分的数组    const requestBodyParts = [];    // --- 第一部分:XML 片段 ---    requestBodyParts.push(encoder.encode(`--${boundaryString}rn`)); // 边界    requestBodyParts.push(encoder.encode(`Content-Disposition: name="request_payload"rn`)); // 内容处置    requestBodyParts.push(encoder.encode(`Content-Type: text/xml; charset=UTF-8rnrn`)); // 内容类型和空行    requestBodyParts.push(encoder.encode(xmlString + 'rn')); // XML 内容和结束换行    // --- 第二部分:二进制文件内容 ---    requestBodyParts.push(encoder.encode(`--${boundaryString}rn`)); // 边界    requestBodyParts.push(encoder.encode(`Content-Disposition: name="tableau_workbook"; filename="workbook-file-name.twb"rn`)); // 内容处置(包含文件名)    requestBodyParts.push(encoder.encode(`Content-Type: application/octet-streamrnrn`)); // 内容类型和空行    requestBodyParts.push(fileArrayBuffer); // 直接添加 ArrayBuffer 形式的文件内容    requestBodyParts.push(encoder.encode('rn')); // 结束换行    // --- 最终边界 ---    requestBodyParts.push(encoder.encode(`--${boundaryString}--rn`)); // 最终边界(注意末尾的两个短横线)    // 2. 将所有部分组合成一个 Blob 对象    // Blob 构造函数可以接受 DOMString, ArrayBuffer, ArrayBufferView, Blob, File 等类型    const requestBodyBlob = new Blob(requestBodyParts, {        type: `multipart/mixed; boundary=${boundaryString}` // 指定整个请求体的 Content-Type    });    // 3. 使用 Axios 发送请求    try {        const response = await axios.post(            endpointUrl,            requestBodyBlob, // 直接发送 Blob 对象作为请求体            {                headers: {                    'Content-Type': `multipart/mixed; boundary=${boundaryString}`, // 再次设置 Content-Type 头部                    // 可以在此处添加其他必要的头部,如认证信息                    // 'Authorization': 'Bearer your_token'                },            }        );        console.log('请求成功:', response.data);        return response.data;    } catch (error) {        console.error('发送请求失败:', error.response ? error.response.data : error.message);        throw error;    }}// 示例用法(在 React 组件或其他浏览器环境中)// const myXmlData = '...';// const myFileData = new ArrayBuffer(1024); // 假设这是从文件读取的 ArrayBuffer// // 或者从 File 对象获取 ArrayBuffer:// // const fileInput = document.getElementById('fileInput');// // const file = fileInput.files[0];// // const reader = new FileReader();// // reader.onload = (e) => {// //   const fileArrayBuffer = e.target.result;// //   sendMultipartMixedInBrowser(myXmlData, fileArrayBuffer, 'https://your-api-endpoint/sites/:siteId/workbooks');// // };// // reader.readAsArrayBuffer(file);// sendMultipartMixedInBrowser(myXmlData, myFileData, 'https://your-api-endpoint/sites/:siteId/workbooks');

重要注意事项:

边界字符串 (boundaryString): 必须是唯一的,且不能出现在请求体内的任何数据中。通常会生成一个随机字符串。行终止符 (rn): 严格按照multipart规范,各部分之间和头部与内容之间必须使用CRLF(回车换行,rn)。空行: 每个部分的头部与内容之间必须有一个空行(即rnrn)。最终边界: 请求体的末尾必须是边界字符串后跟两个短横线(–${boundaryString}–rn)。Blob 对象: 浏览器中,Blob是发送复杂二进制或混合数据类型请求体的理想选择。TextEncoder: 用于将 JavaScript 字符串编码为Uint8Array,以便与二进制数据(ArrayBuffer)一起放入Blob中。Content-Type 头部: 务必在 Axios 请求的headers中设置正确的Content-Type,包括边界字符串。

4. 总结

无论是Node.js还是浏览器环境,构建multipart/mixed请求都需要对HTTP协议的multipart规范有深入理解。

Node.js 环境:form-data库极大地简化了这一过程,通过其append方法和getHeaders()、getBoundary()方法,可以方便地构造请求体和头部。浏览器环境:由于浏览器原生FormData的限制,通常需要手动拼接字符串和二进制数据,然后将其封装成一个Blob对象,并确保Content-Type头部设置正确。

在实际开发中,应根据目标API的要求和所处的运行环境选择合适的实现方式。手动构造multipart/mixed虽然代码量稍大,但提供了最高的灵活性和控制力。

以上就是使用Axios发送multipart/mixed请求的教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1521028.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何实现JavaScript中的函数柯里化?
上一篇 2025年12月20日 13:49:57
Bootstrap Select下拉菜单首次点击不展开问题的解决方案
下一篇 2025年12月20日 13:50:02

相关推荐

  • laravel怎么对数据库查询进行性能分析_laravel数据库查询性能分析方法

    首先启用查询日志并记录执行时间,使用DB::enableQueryLog()捕获SQL语句及耗时,筛选time>100ms的慢查询;接着通过Laravel Debugbar可视化分析数据库调用次数与重复查询;再利用Telescope监控所有数据库活动,查看执行时间与调用位置;同时在AppSer…

    2026年10月1日
    200
  • 如何用免费工具做科技PPT_免费科技风PPT制作的详细指南

    如何用免费工具做科技PPT_免费科技风PPT制作的详细指南如何用免费工具做科技PPT_免费科技风PPT制作的详细指南如何用免费工具做科技PPT_免费科技风PPT制作的详细指南如何用免费工具做科技PPT_免费科技风PPT制作的详细指南

    使用AI工具免费制作科技风PPT,首选AiPPT、轻竹AIPPT、Gamma、Canva和比格AIPPT,支持智能生成、模板应用与协作编辑,全流程高效便捷。 如果您需要制作一份科技风格的PPT,但不想花费额外成本,可以利用当前热门的AI生成工具和在线设计平台来快速完成。这些工具支持一键生成、智能排版…

    2026年10月1日 • 用户投稿
    000
  • java怎样用for循环实现重复执行代码 java循环语句的基础用法教程

    java怎样用for循环实现重复执行代码 java循环语句的基础用法教程java怎样用for循环实现重复执行代码 java循环语句的基础用法教程java怎样用for循环实现重复执行代码 java循环语句的基础用法教程java怎样用for循环实现重复执行代码 java循环语句的基础用法教程

    for循环的初始化部分可以为空,但必须在循环前初始化循环变量以避免错误,例如int i = 0; for (; i < 10; i++) { system.out.println(i); },这种写法在某些场景下可提升代码可读性,但需确保变量已正确初始化,否则会导致未定义行为,因此必须保证循环…

    2026年10月1日 • 用户投稿
    000
  • UC浏览器怎么设置兼容模式_UC浏览器切换IE内核兼容模式指南

    UC浏览器怎么设置兼容模式_UC浏览器切换IE内核兼容模式指南UC浏览器怎么设置兼容模式_UC浏览器切换IE内核兼容模式指南UC浏览器怎么设置兼容模式_UC浏览器切换IE内核兼容模式指南UC浏览器怎么设置兼容模式_UC浏览器切换IE内核兼容模式指南

    1、可通过启用桌面版浏览模式、清除缓存与Cookie、更新浏览器或换用支持IE模式的浏览器解决UC浏览器网页兼容问题。 如果您尝试访问某些网页时遇到显示异常或功能无法正常使用的情况,可能是由于浏览器内核与网页要求不匹配。UC浏览器基于Blink内核开发,并不提供切换至IE内核的兼容模式选项。但您可以…

    2026年10月1日 • 用户投稿
    000
  • 淘宝店铺手机端怎么弄?开店流程怎么样的?

    淘宝店铺手机端怎么弄?开店流程怎么样的?淘宝店铺手机端怎么弄?开店流程怎么样的?淘宝店铺手机端怎么弄?开店流程怎么样的?淘宝店铺手机端怎么弄?开店流程怎么样的?

    首先通过淘宝APP完成开店类型选择,接着进行支付宝实名认证,然后填写店铺名称与经营类目等基础信息,最后等待审核通过并确认开店,即可成功开通淘宝店铺。 如果您想利用移动设备快速启动您的在线生意,通过手机开设淘宝店铺是一个便捷的选择。整个流程主要在手机应用内完成,涉及账号准备、身份验证和店铺设置等环节。…

    2026年10月1日 • 用户投稿
    000
  • Cortana如何处理语音错误_Cortana语音错误修复技巧

    Cortana如何处理语音错误_Cortana语音错误修复技巧Cortana如何处理语音错误_Cortana语音错误修复技巧Cortana如何处理语音错误_Cortana语音错误修复技巧Cortana如何处理语音错误_Cortana语音错误修复技巧

    首先检查麦克风设置并校准,确保Cortana能识别语音;接着确认隐私权限中麦克风访问已开启且Cortana有使用权限;然后通过任务管理器重启Cortana进程;若问题仍在,使用PowerShell重新注册Cortana应用包并重启电脑;最后检查Windows音频相关服务是否正常运行,并更新音频驱动程…

    2026年10月1日 • 用户投稿
    100
  • 百词斩怎么收藏生词本_百词斩生词本管理使用教程

    百词斩怎么收藏生词本_百词斩生词本管理使用教程百词斩怎么收藏生词本_百词斩生词本管理使用教程百词斩怎么收藏生词本_百词斩生词本管理使用教程百词斩怎么收藏生词本_百词斩生词本管理使用教程

    百词斩生词本功能可收藏重点词汇并管理复习。在单词详情页点击右下角星星图标即可收藏;进入“我的生词本”可查看、长按取消或批量管理;建议开启云同步、定期回顾并结合练习模式强化记忆,提升学习效率。 百词斩是一款很受欢迎的背单词应用,它的“生词本”功能可以帮助用户收藏不熟悉或容易记错的词汇,方便日后重点复习…

    2026年10月1日 • 用户投稿
    000
  • 用豆包AI解析Python中的JSONSchema

    用豆包AI解析Python中的JSONSchema用豆包AI解析Python中的JSONSchema用豆包AI解析Python中的JSONSchema用豆包AI解析Python中的JSONSchema

    json schema 是一种用于描述和验证 json 数据结构的工具。1. 它通过定义字段、类型、是否必填等规则确保数据格式一致性;2. 豆包ai可解释其语法、生成模板、辅助调试错误;3. python 中使用 jsonschema 库进行校验,流程包括导入库、定义 schema、准备数据、调用 …

    2026年10月1日 • 用户投稿
    100
  • 千度一下网页版登录入口_千度一下官方网站免费登录地址

    千度一下网页版登录入口_千度一下官方网站免费登录地址千度一下网页版登录入口_千度一下官方网站免费登录地址千度一下网页版登录入口_千度一下官方网站免费登录地址千度一下网页版登录入口_千度一下官方网站免费登录地址

    千度一下网页版登录入口为qiandu.com/,用户可通过首页搜索框进行关键词检索,支持高级筛选与个性化设置,实现移动端与网页端数据同步,并可在社区发布寻人信息、参与互动,享受隐私保护机制。 1、立即进入“☞☞☞☞点击千度一下网页版登录入口☜☜☜☜”; 2、立即进入“☞☞☞☞点击千度一下官方网站免费…

    2026年10月1日 • 用户投稿
    100
  • 拼多多如何看历史价格?查看拼多多历史价格

    拼多多如何看历史价格?查看拼多多历史价格拼多多如何看历史价格?查看拼多多历史价格拼多多如何看历史价格?查看拼多多历史价格拼多多如何看历史价格?查看拼多多历史价格

    可通过历史浏览或第三方工具查拼多多商品历史价格:一、进个人中心点历史浏览,看是否有“降价”提示;二、复制商品链接,用慢慢买等App查完整价格走势图。 如果您想了解某款商品在拼多多上的过往定价情况,以便判断当前价格是否划算,可以通过特定方法查询其价格变化轨迹。以下是几种可行的操作方式: 本文运行环境:…

    2026年10月1日 • 用户投稿
    200
  • Sublime多项目切换 Sublime快速跳转不同工程

    Sublime多项目切换 Sublime快速跳转不同工程Sublime多项目切换 Sublime快速跳转不同工程Sublime多项目切换 Sublime快速跳转不同工程Sublime多项目切换 Sublime快速跳转不同工程

    sublime text通过项目文件和快捷键实现高效多项目切换与文件跳转。1. 创建项目:使用file -> open folder…打开文件夹并通过project -> save project as…保存为.sublime-project文件,同时生成记录会话…

    2026年10月1日 • 用户投稿
    200
  • iCloud官网怎么进_iCloud官方网站进入方法指南

    iCloud官网怎么进_iCloud官方网站进入方法指南iCloud官网怎么进_iCloud官方网站进入方法指南iCloud官网怎么进_iCloud官方网站进入方法指南iCloud官网怎么进_iCloud官方网站进入方法指南

    首先检查网络和浏览器兼容性,再通过iCloud.com输入Apple ID和密码登录;若启用双重认证,需输入受信任设备的验证码或使用通行密钥扫描二维码完成验证;iPhone用户可将iCloud网页添加到主屏幕以便快速访问;最后确认登录信息已正确关联并设为Apple ID的主要联系方式。 如果您尝试访…

    2026年10月1日 • 用户投稿
    100
  • java怎样处理大数据量的集合操作 java高性能处理的编程方法教程

    java怎样处理大数据量的集合操作 java高性能处理的编程方法教程java怎样处理大数据量的集合操作 java高性能处理的编程方法教程java怎样处理大数据量的集合操作 java高性能处理的编程方法教程java怎样处理大数据量的集合操作 java高性能处理的编程方法教程

    选择合适的数据结构是java大数据集合性能优化的基石,因为它直接决定操作的时间与空间复杂度;例如,hashset提供o(1)的查找效率,而arraylist在随机访问时优于linkedlist,但在频繁增删场景下反之;并发场景中应优先使用concurrenthashmap以兼顾线程安全与性能;进一步…

    2026年10月1日 • 用户投稿
    200
  • 如何用Sublime优化前端代码性能_配合插件检测与压缩JS CSS

    如何用Sublime优化前端代码性能_配合插件检测与压缩JS CSS如何用Sublime优化前端代码性能_配合插件检测与压缩JS CSS如何用Sublime优化前端代码性能_配合插件检测与压缩JS CSS如何用Sublime优化前端代码性能_配合插件检测与压缩JS CSS

    要优化前端代码性能,使用sublime text的核心方法是安装并配置插件以实现代码检测与压缩。1. 首先安装package control插件管理器,通过控制台输入安装代码并重启编辑器;2. 安装代码检测插件如jshint/csslint,用于识别javascript和css中的潜在问题,并通过配…

    2026年10月1日 • 用户投稿
    200
  • Project Reactor:在Mono中将Flux聚合为List属性

    本文旨在解决Project Reactor中将Flux数据流聚合为Mono<List>,并将其作为Mono对象内部属性的问题。通过讲解collectList()操作符的应用,结合map操作,演示如何将异步到达的元素收集成列表,并安全地赋值给响应式对象中的列表属性,避免常见的类型不匹配错误…

    2026年10月1日
    100
  • 谷歌浏览器官方正式版入口 最新Chrome官网登录网址

    谷歌浏览器官方正式版入口是https://www.google.cn/chrome/,该网址提供适用于Windows、Mac、安卓和iOS的正版下载,集成搜索、翻译、同步等功能,并建议用户通过此官网获取最新安全版本。 直达入口一:“☞☞☞☞谷歌浏览器官方正式版入口☜☜☜☜☜点击进入”; 直达入口一:…

    2026年10月1日
    600
  • 微软的Gaming Copilot更像是AI版的查攻略

    微软的Gaming Copilot更像是AI版的查攻略微软的Gaming Copilot更像是AI版的查攻略微软的Gaming Copilot更像是AI版的查攻略微软的Gaming Copilot更像是AI版的查攻略

    微软的copilot ai从下周开始就要登陆windows pc上的xbox游戏栏(xbox game bar)。这项名为“游戏copilot”的新功能刚在上个月公布,截至周四,它已开始在pc上进行全面beta测试,并将于10月登陆xbox移动app。顾名思义,它是copilot的游戏专属版本,微软…

    2026年10月1日 • 用户投稿
    800
  • 拼多多店铺怎么查询商品?拼多多店铺怎么查询商品价格

    拼多多店铺怎么查询商品?拼多多店铺怎么查询商品价格拼多多店铺怎么查询商品?拼多多店铺怎么查询商品价格拼多多店铺怎么查询商品?拼多多店铺怎么查询商品价格拼多多店铺怎么查询商品?拼多多店铺怎么查询商品价格

    答案:可通过店铺内搜索、平台搜索筛选店铺、查看商品详情页获取价格。进入目标店铺,使用“店内搜”输入关键词查找;或在拼多多主搜索框输入店铺名,进入后浏览商品列表;点击商品进入详情页可查看当前售价、促销价及划线价等详细信息。 如果您想在拼多多店铺中查找特定商品或了解其价格信息,可以通过平台内的多种方式进…

    2026年10月1日 • 用户投稿
    100
  • 拼多多无法联系客服怎么办 客服入口与处理方案

    拼多多无法联系客服怎么办 客服入口与处理方案拼多多无法联系客服怎么办 客服入口与处理方案拼多多无法联系客服怎么办 客服入口与处理方案拼多多无法联系客服怎么办 客服入口与处理方案

    遇到拼多多客服难联系时,可先在APP内“我的-客服”输入“人工客服”或“12345”触发转接,避免高峰时段尝试;若无效,拨打021-53395288或邮件service@pinduoduo.com联系;仍无果可微信提交“12315”小程序投诉,填写企业名称“上海寻梦网络科技有限公司”并上传证据;也可…

    2026年10月1日 • 用户投稿
    100
  • Sublime插件推荐2025年度榜单|程序员人手必备扩展合集

    Sublime插件推荐2025年度榜单|程序员人手必备扩展合集Sublime插件推荐2025年度榜单|程序员人手必备扩展合集Sublime插件推荐2025年度榜单|程序员人手必备扩展合集Sublime插件推荐2025年度榜单|程序员人手必备扩展合集

    sublime text 必装插件包括package control、emmet、sidebarenhancements、gitgutter、colorpicker、docblockr、advancednewfile和find++。package control是插件管理基础工具;emmet提升ht…

    2026年10月1日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信