使用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="xsd"; filename="myfile.xsd"']"/> <!-- 将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属性中的双引号需要转义为
",避免XML解析器截断属性值,导致匹配规则失效 - 不需要手动给
c:multipart添加boundary属性,XmlCalabash会在发送前自动生成适配的边界值,并同步更新请求头
内容的提问来源于stack exchange,提问作者DiZzZz
相关产品推荐
相关产品推荐

