WSO2 EI调用REST API实现Postman式发送并下载文件方法
WSO2 EI 接收二进制文件下载接口配置修改方案
核心问题原因
Postman的「Send and Download」本质是不尝试对响应做文本/结构化格式解析,直接按原始二进制流完整拉取响应体;你当前配置拿到空响应,是几个配置错误导致的:
- 调用文件下载接口时,WSO2 EI默认会用文本/结构化消息构建器解析二进制流,直接把流解析为空内容,和Postman点普通「Send」拿到空响应的逻辑一致
- 配置中错误添加了
OUT_ONLY=true属性,该属性会直接丢弃当前消息上下文里的响应体 - VFS写入端点缺少二进制写入配置、文件名规则,默认按文本模式写入会导致文件为空或损坏
- 空的
outSequence会导致响应流在序列流转时被丢弃
必须调整的配置项
- 在调用文件下载接口(即配置中
https://efgh地址)前,新增二进制流接收相关属性,强制WSO2不做结构化解析,直接保留原始二进制流:
<!-- 强制消息按二进制流处理,不做文本/JSON/XML解析 --> <property name="messageType" value="application/octet-stream" scope="axis2"/> <property name="ContentType" value="application/octet-stream" scope="axis2"/> <!-- 禁用字符编码转换,避免二进制流被转码损坏 --> <property name="BINARY_CONTENT_HANDLING" value="binary" scope="axis2"/> <!-- 按需关闭分块传输,适配部分不支持分块的下载接口 --> <property name="DISABLE_CHUNKING" value="true" scope="axis2"/>
- 删除错误属性:
- 移除
<property name="OUT_ONLY" value="true"/>,该属性会强制丢弃响应payload - 移除
<property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>,该属性用于给调用方返回202状态码,本地写VFS场景不需要
- 移除
- 补全VFS端点参数,指定二进制写入模式、固定文件名,避免写入空文件:
原VFS地址修改为带参数的形式,例如下载的文件命名为target_file(后缀可根据实际下载的文件类型自行补充):
如果需要从响应头<address uri="vfs:file:///C:/Work?transport.vfs.FileName=target_file.bin&transport.vfs.Append=false"/>Content-Disposition中提取接口返回的原始文件名,可以在调用完下载接口后加属性提取文件名,再传给VFS。
修改完成的完整可用配置
<?xml version="1.0" encoding="UTF-8"?> <proxy name="Proxy" startOnLoad="true" transports="http https vfs" xmlns="http://ws.apache.org/ns/synapse"> <target> <inSequence> <call> <endpoint> <http method="post" uri-template="https://abcd"> </http> </endpoint> </call> <log> <property expression="get-property('axis2', 'HTTP_SC')" name="log-1"/> </log> <filter regex="200" source="get-property('axis2', 'HTTP_SC')"> <then> <!-- 新增二进制流接收配置,复现Postman Send and Download逻辑 --> <property name="messageType" value="application/octet-stream" scope="axis2"/> <property name="ContentType" value="application/octet-stream" scope="axis2"/> <property name="BINARY_CONTENT_HANDLING" value="binary" scope="axis2"/> <property name="DISABLE_CHUNKING" value="true" scope="axis2"/> <call> <endpoint> <http method="post" uri-template="https://efgh"> </http> </endpoint> </call> <log> <property expression="get-property('axis2', 'HTTP_SC')" name="log-2"/> </log> <property name="ClientApiNonBlocking" value="true" scope="axis2" action="remove"/> <!-- VFS端点补全文件名、写入配置 --> <send> <endpoint> <address uri="vfs:file:///C:/Work?transport.vfs.FileName=downloaded_file&transport.vfs.Append=false"/> </endpoint> </send> </then> </filter> </inSequence> <outSequence/> <faultSequence/> </target> </proxy>
如果下载的是特定格式文件(比如PDF、Excel),可以把
messageType和ContentType的值改成对应MIME类型,VFS文件名也补上对应后缀即可。
内容的提问来源于stack exchange,提问作者aditi21
相关产品推荐
相关产品推荐

