在 WSO Api Manager 3.2 中通过中介将具有内容类型 application/pdf 的传入 PDF 二进制文件转换为 base64

问题描述

描述:我正在尝试使用 wso2 api manager 3.2 中介将具有内容/类型应用程序/pdf 的传入 pdf 文件转换为 base64,但我不知道如何实现这一点。我还在axis.xml 中添加messageformatters 和messagebuilders,但仍然无法弄清楚。任何人的帮助都会非常可观。

在 Axis.xml 中添加

<messageformatter contentType="application/pdf" 
                        class="org.wso2.carbon.relay.Expandingmessageformatter"/>
<messageBuilder contentType="application/pdf" 
                            class="org.wso2.carbon.relay.BinaryRelayBuilder"/>

响应调解

<sequence xmlns="http://ws.apache.org/ns/synapse" name="response.xml">
<property expression="$body/*" name="messageBody" scope="default" />
<property expression="base64Encode(get-property('messageBody'))" name="EncodeBody" scope="default" />
<log level="custom">
    <property expression="get-property('EncodeBody')" name="EncodeBody" />
</log>
<property name="messageType" scope="axis2" type="STRING" value="application/pdf" />
<property name="contentType" scope="axis2" type="STRING" value="application/pdf" />
</sequence>

预期输出

{
    "data": {
        "file": "base64data"
    }
}

原始回复

enter image description here

错误日志

TID: [-1234] [] [2021-05-07 11:23:42,163] ERROR {org.apache.synapse.transport.passthru.util.RelayUtils} - Error while building Passthrough stream org.apache.axis2.AxisFault: #Can not parse stream. MessageID: urn:uuid:407d7c54-df47-46aa-ada9-9cde9b3eebe1. Error>>> #getNewJsonPayload. Could not save JSON payload. Invalid input stream found. Payload is not a JSON string.
    at org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:862)
    at org.apache.synapse.commons.json.JsonStreamBuilder.processDocument(JsonStreamBuilder.java:43)
    at org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:153)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:169)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:122)
    at org.apache.synapse.mediators.AbstractListMediator.buildMessage(AbstractListMediator.java:152)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:95)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate_aroundBody0(apimanagerExtensionHandler.java:73)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate(apimanagerExtensionHandler.java:58)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse_aroundBody4(apimanagerExtensionHandler.java:132)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse(apimanagerExtensionHandler.java:120)
    at org.apache.synapse.rest.API.process(API.java:371)
    at org.apache.synapse.rest.RESTRequestHandler.apiProcessNonDefaultStrategy(RESTRequestHandler.java:144)
    at org.apache.synapse.rest.RESTRequestHandler.identifyAPI(RESTRequestHandler.java:164)
    at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:90)
    at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:60)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:331)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:583)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:197)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:285)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.axis2.AxisFault: #getNewJsonPayload. Could not save JSON payload. Invalid input stream found. Payload is not a JSON string.
    at org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:846)
    ... 26 more

TID: [-1234] [] [2021-05-07 11:23:42,169] ERROR {org.apache.synapse.mediators.base.SequenceMediator} - {api:admin--CreditorWatchDownloadCreditReportPDF:v1.0.0} Error while building message. Error while building Passthrough stream org.apache.axis2.AxisFault: Error while building Passthrough stream
    at org.apache.synapse.transport.passthru.util.RelayUtils.handleException(RelayUtils.java:452)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:215)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:122)
    at org.apache.synapse.mediators.AbstractListMediator.buildMessage(AbstractListMediator.java:152)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:95)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate_aroundBody0(apimanagerExtensionHandler.java:73)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate(apimanagerExtensionHandler.java:58)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse_aroundBody4(apimanagerExtensionHandler.java:132)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse(apimanagerExtensionHandler.java:120)
    at org.apache.synapse.rest.API.process(API.java:371)
    at org.apache.synapse.rest.RESTRequestHandler.apiProcessNonDefaultStrategy(RESTRequestHandler.java:144)
    at org.apache.synapse.rest.RESTRequestHandler.identifyAPI(RESTRequestHandler.java:164)
    at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:90)
    at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:60)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:331)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:583)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:197)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:285)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.axis2.AxisFault: #Can not parse stream. MessageID: urn:uuid:407d7c54-df47-46aa-ada9-9cde9b3eebe1. Error>>> #getNewJsonPayload. Could not save JSON payload. Invalid input stream found. Payload is not a JSON string.
    at org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:862)
    at org.apache.synapse.commons.json.JsonStreamBuilder.processDocument(JsonStreamBuilder.java:43)
    at org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:153)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:169)
    ... 23 more
Caused by: org.apache.axis2.AxisFault: #getNewJsonPayload. Could not save JSON payload. Invalid input stream found. Payload is not a JSON string.
    at org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:846)
    ... 26 more

TID: [-1234] [] [2021-05-07 11:23:42,173] ERROR {API_LOGGER.admin--CreditorWatchDownloadCreditReportPDF} - Error while building message. Error while building Passthrough stream org.apache.axis2.AxisFault: Error while building Passthrough stream
    at org.apache.synapse.transport.passthru.util.RelayUtils.handleException(RelayUtils.java:452)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:215)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:122)
    at org.apache.synapse.mediators.AbstractListMediator.buildMessage(AbstractListMediator.java:152)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:95)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate_aroundBody0(apimanagerExtensionHandler.java:73)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate(apimanagerExtensionHandler.java:58)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse_aroundBody4(apimanagerExtensionHandler.java:132)
    at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse(apimanagerExtensionHandler.java:120)
    at org.apache.synapse.rest.API.process(API.java:371)
    at org.apache.synapse.rest.RESTRequestHandler.apiProcessNonDefaultStrategy(RESTRequestHandler.java:144)
    at org.apache.synapse.rest.RESTRequestHandler.identifyAPI(RESTRequestHandler.java:164)
    at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:90)
    at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:60)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:331)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:583)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:197)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:285)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

类似于此链接Encoding PDF binary data to base64 not working with NodeJS,但需要在 wso2 api manager 中进行

解决方法

根据共享的堆栈跟踪,在调解过程中没有选择正确的格式化程序和构建器。 API 管理器使用 JSONStreamBuilder 来构建消息。

API Manager v3.2.0 使用集中式配置来配置 XML 工件。因此,如果您通过直接编辑 axis2.xml 来配置 Message Builders 和 Formatters,那么这些配置将在服务器启动时丢失。在 <apim>/repository/conf/deployment.toml

中执行以下配置
[[custom_message_formatters]]
class = "org.wso2.carbon.relay.ExpandingMessageFormatter"
content_type = "application/pdf"

[[custom_message_builders]]
class = "org.wso2.carbon.relay.BinaryRelayBuilder"
content_type = "application/pdf"

并重新启动服务器并重试该场景。