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

如何发送带请求体的POST请求并在新标签页打开返回的二进制文件?

实现POST JSON并在新窗口打开返回的PDF

当然可行!我刚好做过类似的需求,给你两种靠谱的实现方式,看哪种更适配你的后端情况:

方案一:动态创建表单提交(适合后端支持表单参数传递JSON的场景)

如果你的后端可以接受表单格式的请求(比如从指定参数里读取JSON字符串),可以用这种无AJAX的方式,直接通过表单提交打开新窗口:

// 你的JSON对象
const myJson = { name: "test", data: [1,2,3] };

// 创建动态表单
const form = document.createElement('form');
form.method = 'POST';
form.action = '你的REST端点URL';
form.target = '_blank'; // 关键:在新窗口打开

// 创建隐藏字段存放JSON字符串
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'payload'; // 后端要从这个参数取JSON
input.value = JSON.stringify(myJson);

form.appendChild(input);
document.body.appendChild(form);

// 提交表单
form.submit();

// 清理DOM
document.body.removeChild(form);

方案二:Fetch API获取Blob后打开新窗口(适合后端要求请求体为纯JSON的场景)

如果你的REST端点要求请求体是原生JSON(Content-Type为application/json),那用Fetch先拿到PDF的Blob,再生成临时URL打开是更合适的方式:

const myJson = { name: "test", data: [1,2,3] };

fetch('你的REST端点URL', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    // 如果需要认证,这里可以加Authorization头
  },
  body: JSON.stringify(myJson)
})
.then(response => {
  if (!response.ok) {
    throw new Error('请求失败');
  }
  return response.blob(); // 把响应转为Blob对象
})
.then(blob => {
  // 创建临时URL
  const blobUrl = URL.createObjectURL(blob);
  // 在新窗口打开
  const newWindow = window.open(blobUrl);
  
  // 窗口加载完成后释放临时URL,避免内存泄漏
  newWindow.onload = () => {
    URL.revokeObjectURL(blobUrl);
  };
})
.catch(error => {
  console.error('出错了:', error);
  // 这里可以加错误提示,比如alert('生成PDF失败')
});

关于JSON的处理

不管用哪种方案,你都需要用JSON.stringify()把JavaScript对象转换成JSON字符串——这一步是必须的,因为HTTP请求只能传递文本或二进制数据,不能直接传JS对象。

另外要注意后端的响应头:确保后端返回的PDF设置了正确的Content-Type: application/pdf,这样浏览器才能正确识别并渲染PDF内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:14