You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Next.js API路由将第三方API返回的字符串下载为XML文件?

问题:Next.js API路由无法触发XML文件下载

我在Next.js项目中配置了一条API路由,该路由通过fetch调用第三方API,接口返回的是包含XML数据的字符串。我尝试将该字符串作为可下载文件(如test.xml)在浏览器中提供,但无法成功触发下载。以下是我目前编写的/pages/api/registration.js代码:

import stream from 'stream';
import { promisify } from 'util';
import fetch from 'node-fetch';

const pipeline = promisify(stream.pipeline);
const url = process.env.API_URL + 'registration';

const handler = async (req, res) => {
  const headers = new Headers();
  headers.append('Accept', 'application/json');
  headers.append('Content-Type', 'application/json');

  const response = await fetch(url, {
    method: 'POST',
    mode: 'same-origin',
    credentials: 'include',
    redirect: 'follow',
    headers: headers,
    body: JSON.stringify(req.body),
  });

  if (!response.ok) throw new Error(`unexpected response ${response.statusText}`);
  
  res.setHeader('Content-Type', 'text/xml');
  res.setHeader('Content-Disposition', 'attachment; filename=test.xml');
  await pipeline(response.body, res);
}

export default handler;

请问有什么解决思路吗?


解决思路
  • 修正请求头的Accept字段:当前设置的Accept: application/json会告知第三方API你期望JSON响应,但实际需要的是XML。将其改为Accept: text/xml,或直接移除该字段,让第三方API返回默认的XML格式。
  • 移除无效的fetch选项:mode: 'same-origin'是浏览器环境的fetch专属配置,在Node.js的node-fetch中不生效,直接删除该配置避免潜在解析错误。
  • 规范Content-Disposition格式:给文件名添加双引号,确保所有浏览器都能正确识别,修改为:
    res.setHeader('Content-Disposition', 'attachment; filename="test.xml"');
    
  • 改用字符串传递而非流管道:如果第三方API返回的是XML字符串,直接读取响应内容后发送比流管道更可靠,避免编码或适配问题。替换原pipeline部分的代码:
    const xmlContent = await response.text();
    res.setHeader('Content-Length', Buffer.byteLength(xmlContent, 'utf8'));
    res.send(xmlContent);
    
  • 完善错误处理逻辑:不要直接抛出错误,捕获异常后返回合适的HTTP状态码,避免请求异常时无响应:
    try {
      // 原有的fetch和响应处理逻辑
    } catch (err) {
      res.status(500).json({ error: err.message });
    }
    

内容的提问来源于stack exchange,提问作者Primoz Rome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:05:18