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

Azure API Management中如何为multipart/form-data请求体添加变量

在Azure API Management中修改multipart/form-data请求体的方法

multipart/form-data格式无法直接像JSON那样反序列化为对象处理,因为它是由多个独立的表单部分通过boundary分隔组成的。以下是正确的修改步骤和示例策略:

核心思路

  1. 从请求头提取multipart的boundary分隔符
  2. 读取原始请求体内容
  3. 按照multipart格式构造新的表单字段部分
  4. 将新字段插入到原始请求体中,重新组装成完整的multipart请求体

完整策略代码

<policies>
    <inbound>
        <base />
        <!-- 获取Content-Type头 -->
        <set-variable name="contentType" value="@(context.Request.Headers.GetValueOrDefault("Content-Type", ""))" />
        <choose>
            <when condition="@(contentType.StartsWith("multipart/form-data"))">
                <!-- 提取boundary(处理带引号的情况) -->
                <set-variable name="boundary" value="@(
                    contentType.Split(';')
                               .FirstOrDefault(s => s.Trim().StartsWith("boundary="))?
                               .Split('=')
                               .Last()
                               .Trim()
                               .Trim('"') ?? ""
                )" />
                <!-- 读取原始请求体,preserveContent确保后续可重复读取 -->
                <set-variable name="originalBody" value="@(context.Request.Body.As<string>(preserveContent: true))" />
                <!-- 构造要添加的新表单字段 -->
                <set-variable name="newFormPart" value="@($"--{context.Variables["boundary"]}\r\nContent-Disposition: form-data; name=\"additional_field\"\r\n\r\nfield_value\r\n")" />
                <!-- 在原始请求体的结束标记前插入新字段 -->
                <set-variable name="modifiedBody" value="@(
                    context.Variables["originalBody"].ToString()
                           .Replace($"--{context.Variables["boundary"]}--", 
                                    $"{context.Variables["newFormPart"]}--{context.Variables["boundary"]}--")
                )" />
                <!-- 设置修改后的请求体 -->
                <set-body>@(context.Variables["modifiedBody"].ToString())</set-body>
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

关键注意事项

  • 必须设置preserveContent: true:读取请求体时保留原始内容,避免后续流程无法访问请求体
  • 处理boundary的引号:部分请求中boundary会被双引号包裹,需要额外去除引号确保格式正确
  • 严格遵循multipart格式:新字段必须包含正确的Content-Disposition头和分隔符,否则后端无法解析
  • 避免重复结束标记:插入新字段时要替换原始的结束标记,防止出现多个--boundary--结尾

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:01:05