如何通过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
相关产品推荐
相关产品推荐

