You need to enable JavaScript to run this app. 使用XProc p:http-request发送multipart/form-data POST请求嵌入XSD文件的方案
优惠活动
大模型
产品
解决方案
定价
更多

使用XProc p:http-request发送multipart/form-data POST请求嵌入XSD文件的方案

XProc中p:http-request实现multipart/form-data POST携带XSD文件的方法

针对OxygenXML v23.1内置XmlCalabash环境下的实现需求,可按照以下方式完成请求构造,解决XSD文件内容无法正确写入的问题。

原有代码的常见修正点

  • 普通表单字段的MIME类型取值错误:原代码使用的plain/text属于非法MIME值,正确取值为text/plain,否则服务端无法正确解析表单字段
  • 手动硬编码boundary值:p:http-request会自动生成符合RFC规范的随机边界值,手动指定容易出现边界字符串与请求内容冲突,导致请求解析失败
  • 硬编码XSD内容占位:c:body节点可直接接收XML文档内容,不需要手动把XSD转成字符串塞在标签内,XmlCalabash会自动完成请求序列化

可直接运行的实现代码

<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">

    <!-- 主输入端口加载待上传的XSD文件 -->
    <p:input port="source" primary="true">
        <p:document href="my.xsd"/>
    </p:input>
    <p:output port="result" primary="true"/>

    <!-- 构造不带XSD内容的基础multipart请求骨架 -->
    <p:identity name="base-request">
        <p:input port="source">
            <p:inline>
                <c:request href="https://myserver" method="post">
                    <c:multipart content-type="multipart/form-data">
                        <!-- XSD上传字段的空占位节点 -->
                        <c:body content-type="application/xml" disposition='form-data; name="xsd"; filename="myfile.xsd"'/>
                        <!-- 普通表单字段,使用合法的text/plain MIME类型 -->
                        <c:body content-type="text/plain" disposition='form-data; name="arg1"'>4</c:body>
                        <c:body content-type="text/plain" disposition='form-data; name="arg2"'>on</c:body>
                    </c:multipart>
                </c:request>
            </p:inline>
        </p:input>
    </p:identity>

    <!-- 将XSD内容插入到对应占位节点下,形成完整请求体 -->
    <p:insert name="build-request">
        <p:input port="source">
            <!-- 传入待插入的XSD内容 -->
            <p:pipe step="" port="source"/>
        </p:input>
        <p:input port="insertion">
            <!-- 传入基础请求骨架 -->
            <p:pipe step="base-request" port="result"/>
        </p:input>
        <!-- 匹配XSD字段对应的占位body节点 -->
        <p:option name="match" value="c:body[@disposition='form-data; name=&quot;xsd&quot;; filename=&quot;myfile.xsd&quot;']"/>
        <!-- 将XSD作为该body的子节点插入 -->
        <p:option name="position" value="first-child"/>
    </p:insert>

    <!-- 发送构造完成的POST请求 -->
    <p:http-request>
        <p:input port="source">
            <p:pipe step="build-request" port="result"/>
        </p:input>
    </p:http-request>

</p:declare-step>

实现注意事项

  • 插入XSD内容时不需要对XML做特殊转义处理,XmlCalabash会自动按照multipart格式规范,把XML内容序列化为合法的请求体片段,自动处理编码和边界分割
  • 检查disposition属性的引号转义:XML属性中的双引号需要转义为&quot;,避免XML解析器截断属性值,导致匹配规则失效
  • 不需要手动给c:multipart添加boundary属性,XmlCalabash会在发送前自动生成适配的边界值,并同步更新请求头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 13:45:01