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

如何通过POST请求在两个REST API之间转发文件?

API间文件转发:通过POST请求实现跨API文件传输

核心逻辑

要实现两个REST API之间的文件转发,本质是让中间API(转发方)同时扮演两个角色:

  1. 作为服务端,接收上游API(文件来源方)发来的文件
  2. 作为客户端,将接收到的文件以POST请求发送给下游API(文件接收方)

核心是处理multipart/form-data格式的请求——这是文件上传的标准HTTP格式,转发时需要完整保留文件的二进制数据、文件名、内容类型等元信息。

实现示例

Python 实现(使用requests库)

假设中间API用Flask搭建,上游发来的文件在request.files中,直接构造转发请求:

from flask import Flask, request
import requests

app = Flask(__name__)

# 下游API的文件上传接口地址
DOWNSTREAM_API_URL = "http://your-downstream-api/upload"

@app.route("/forward-file", methods=["POST"])
def forward_file():
    # 1. 接收上游传来的文件
    uploaded_file = request.files.get("file")
    if not uploaded_file:
        return "No file provided", 400

    # 2. 构造转发的multipart请求
    files = {
        "file": (uploaded_file.filename, uploaded_file.stream, uploaded_file.content_type)
    }

    # 3. 发送POST请求到下游API
    try:
        response = requests.post(DOWNSTREAM_API_URL, files=files)
        response.raise_for_status()  # 抛出HTTP错误
        return f"File forwarded successfully. Downstream response: {response.text}", response.status_code
    except requests.exceptions.RequestException as e:
        return f"Failed to forward file: {str(e)}", 500

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

Node.js 实现(使用Express + form-data库)

Node.js中需要手动处理文件流,用form-data库构造multipart请求:

const express = require('express');
const multer = require('multer');
const FormData = require('form-data');
const axios = require('axios');

const app = express();
const upload = multer({ storage: multer.memoryStorage() }); // 内存存储文件,适合小文件

// 下游API地址
const DOWNSTREAM_API_URL = "http://your-downstream-api/upload";

// 接收上游文件并转发
app.post('/forward-file', upload.single('file'), async (req, res) => {
    if (!req.file) {
        return res.status(400).send('No file provided');
    }

    // 构造form-data请求体
    const form = new FormData();
    form.append('file', req.file.buffer, {
        filename: req.file.originalname,
        contentType: req.file.mimetype
    });

    try {
        // 发送请求到下游API,需传递form的边界头
        const downstreamResponse = await axios.post(DOWNSTREAM_API_URL, form, {
            headers: form.getHeaders()
        });
        res.status(downstreamResponse.status).send(`File forwarded. Downstream response: ${downstreamResponse.data}`);
    } catch (error) {
        res.status(500).send(`Forward failed: ${error.message}`);
    }
});

app.listen(3000, () => {
    console.log('Forward service running on port 3000');
});

关键注意事项

  • 大文件处理:如果转发大文件,不要把整个文件加载到内存(比如Python用uploaded_file.stream、Node.js用磁盘存储代替内存存储),采用流式传输避免内存溢出。
  • 元信息保留:务必传递文件的filename和content-type,否则下游API可能无法正确解析文件。
  • 错误处理:要捕获请求超时、下游API返回错误等异常情况,返回清晰的错误信息。
  • 请求头传递:如果上游请求包含认证头(如Authorization),需要根据需求决定是否转发到下游API。
  • 边界字符:multipart/form-data的边界字符会自动生成,无需手动设置,依赖库处理即可。

内容的提问来源于stack exchange,提问作者Vijay Krishna A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:22:38