WSO2 API Manager 3.2 中介转换application/pdf二进制为base64问题求助
问题根因
你遇到的报错是由于网关默认使用JSON解析器处理返回的PDF二进制流导致,具体错误点如下:
- 自定义响应序列未在执行初始指定当前消息类型为application/pdf,网关直接调用默认JSON解析器读取PDF流,触发解析异常
- 使用
$body/*读取二进制内容的方式错误:BinaryRelayBuilder解析后的二进制流不会存储在消息体XML节点中,而是存储在axis2域的MESSAGE_BINARY内置属性里 - 序列末尾将content-type设置为application/pdf,和你需要输出JSON响应的需求冲突
解决方案
步骤1:确认axis2配置生效
你已经添加的application/pdf对应的messageBuilder和messageFormatter配置是正确的,确认配置是写在<APIM_HOME>/repository/conf/axis2/axis2.xml文件中,修改后重启网关生效。
步骤2:替换为正确的响应中介序列
完整的响应序列配置如下:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="response.xml"> <!-- 最开头指定当前消息为PDF二进制,强制网关使用BinaryRelayBuilder处理流,避免JSON解析错误 --> <property name="messageType" scope="axis2" type="STRING" value="application/pdf" /> <property name="contentType" scope="axis2" type="STRING" value="application/pdf" /> <!-- 读取二进制内容并编码为base64 --> <property name="pdfBase64" expression="base64Encode(get-property('axis2', 'MESSAGE_BINARY'))" scope="default" /> <!-- 可选:打印编码结果便于调试 --> <log level="custom"> <property name="EncodedPDF" expression="get-property('pdfBase64')" /> </log> <!-- 构造你需要的JSON响应格式 --> <payloadFactory media-type="json"> <format> { "data": { "file": "$1" } } </format> <args> <arg evaluator="xml" expression="get-property('pdfBase64')" /> </args> </payloadFactory> <!-- 最后指定响应类型为JSON --> <property name="messageType" scope="axis2" type="STRING" value="application/json" /> <property name="contentType" scope="axis2" type="STRING" value="application/json" /> </sequence>
步骤3:附加注意事项
- 如果处理的PDF文件体积较大,需要在axis2.xml中调整二进制缓冲阈值,避免流被截断:找到
<transportReceiver name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpListener">节点,添加参数<parameter name="bufferSize">10485760</parameter>(示例为10M,可根据实际PDF大小调整),HTTPS对应的transportReceiver节点也需要同步添加。 - 配置完成后需要在API的「运行配置」页中,将响应中介序列选择为你自定义的序列,重新发布API生效。
内容的提问来源于stack exchange,提问作者Amit Chaurasia
相关产品推荐
相关产品推荐

