Wso2 将多部分/表单数据从ESB发送到APIM
我正在使用WSO2 ESB 6.4.0和APIM 2.6.0 我正在使用APIM应用程序的RESTAPI在APIM服务器中添加证书。 在添加新证书的请求中,post请求应该是表单数据 因此,为了自动化这个过程,我使用ESB服务器。我已经编写了一个代理,它将选择证书文件并对其进行处理。下面是我的代理代码Wso2 将多部分/表单数据从ESB发送到APIM,wso2,wso2esb,wso2-am,wso2carbon,Wso2,Wso2esb,Wso2 Am,Wso2carbon,我正在使用WSO2 ESB 6.4.0和APIM 2.6.0 我正在使用APIM应用程序的RESTAPI在APIM服务器中添加证书。 在添加新证书的请求中,post请求应该是表单数据 因此,为了自动化这个过程,我使用ESB服务器。我已经编写了一个代理,它将选择证书文件并对其进行处理。下面是我的代理代码 <?xml version="1.0" encoding="UTF-8"?> <proxy name="ClientSslCertificateAdd-APIM" startOn
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="ClientSslCertificateAdd-APIM" startOnLoad="true" transports="http https vfs" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<!-- <enrich>
<source clone="true" type="body"/>
<target property="originalBody" type="property" />
</enrich>
<property expression="get-property('originalBody')"
name="payloadposttexttransformation"
scope="default"
type="STRING"/> -->
<property expression="$body/*" name="payload" scope="default" type="STRING"/>
<property expression="get-property('payload')" name="xml form certificate captured ===" scope="default" type="STRING"/>
<xslt description="" key="xmltotext"/>
<property expression="$body/*" name="payloadpostmapping" scope="default" type="STRING"/>
<property name="filename" scope="default" type="STRING" value="filename_certifiate"/>
<property name="alias" scope="default" type="STRING" value="alias_certifiate"/>
<property name="endpoint" scope="default" type="STRING" value="endpoint_certifiate"/>
<property name="uri.var.host" scope="default" type="STRING" value="http://apimserver.com/"/>
<property name="uri.var.context" scope="default" type="STRING" value="certificates"/>
<property expression="get-property('alias')" name="uri.var.resourcepath" scope="default" type="STRING"/>
<property name="Authorization" scope="transport" type="STRING" value="Bearer token"/>
<call>
<endpoint>
<http method="get" uri-template="{uri.var.host}/{uri.var.context}/{uri.var.resourcepath}"/>
</endpoint>
</call>
<property expression="json-eval($.status)" name="currentstatusoftobeaddedalias" scope="default" type="STRING"/>
<filter regex="Expired" source="get-property('currentstatusoftobeaddedalias')">
<then>
<property expression="get-property('alias')" name="alias" scope="default" type="STRING"/>
<property expression="get-property('endpoint')" name="endpoint" scope="default" type="STRING"/>
<property name="Authorization" scope="transport" type="STRING" value="Bearer token"/>
<property name="messageType" scope="axis2" type="STRING" value="multipart/form-data"/>
<payloadFactory media-type="xml">
<format>
<root xmlns="">
<certificate charset="UTF-8" contentType="text/plain" xmlns="http://org.apache.axis2/xsd/form-data">$3</certificate>
<alias xmlns="http://org.apache.axis2/xsd/form-data">$1</alias>
<endpoint xmlns="http://org.apache.axis2/xsd/form-data">$2</endpoint>
</root>
</format>
<args>
<arg evaluator="xml" expression="$ctx:alias"/>
<arg evaluator="xml" expression="$ctx:endpoint"/>
<arg evaluator="xml" expression="$ctx:payloadpostmapping"/>
</args>
</payloadFactory>
<property name="DISABLE_CHUNKING" scope="axis2" type="STRING" value="true"/>
<!-- <property name="ContentType" scope="axis2" value="multipart/form-data" type="STRING"/> -->
<property name="messageType" scope="axis2" type="STRING" value="multipart/form-data"/>
<!-- <call>
<endpoint>
<http format="rest" method="post" uri-template="http://apimserver.com"/>
</endpoint>
</call> -->
<send>
<endpoint>
<http method="POST" format="rest"
uri-template="http://apimserver.com"/>
</endpoint>
</send>
</then>
<else>
<log>
<property name="alreadypresent" value="with entered alias name, certificate is active"/>
</log>
</else>
</filter>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
<parameter name="transport.PollInterval">5</parameter>
<parameter name="transport.vfs.FileURI">file:///opt/new/esb/clientSSLcertificate_repo/</parameter>
<parameter name="transport.vfs.ContentType">application/xml;charset=UTF-8</parameter>
<parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
<parameter name="transport.vfs.MoveAfterFailure">file:///opt/new/esb/clientSSLcertificate_repo/failed_clientSSLcertificate</parameter>
<parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
<parameter name="transport.vfs.FileNamePattern">.*.xml</parameter>
<parameter name="transport.vfs.MoveAfterProcess">file:///opt/new/esb/clientSSLcertificate_repo/updated_clientSSLcertificate</parameter>
</proxy>
从错误日志来看,APIM服务器似乎无法从ESB获取附加文件,这就是它无法处理请求的原因
APIM 2.6.0是否支持多部分/表单数据
谢谢我们遇到了类似的问题,我们必须在axis2/axis2.xml文件(ESB和APIM中)中更新messageFormatters和messageBuilders: 更新消息格式化程序:
<!-- <messageFormatter contentType="multipart/form-data"
class="org.apache.axis2.transport.http.MultipartFormDataFormatter"/ -->
<messageFormatter contentType="multipart/form-data"
class="org.wso2.carbon.relay.ExpandingMessageFormatter"/>
更新消息生成器
<!-- messageBuilder contentType="multipart/form-data"
class="org.apache.axis2.builder.MultipartFormDataBuilder"/ -->
<messageBuilder contentType="multipart/form-data"
class="org.wso2.carbon.relay.BinaryRelayBuilder"/>
这些更新应该更改传输以流式传输负载,而无需解析和重建负载
<!-- <messageFormatter contentType="multipart/form-data"
class="org.apache.axis2.transport.http.MultipartFormDataFormatter"/ -->
<messageFormatter contentType="multipart/form-data"
class="org.wso2.carbon.relay.ExpandingMessageFormatter"/>
<!-- messageBuilder contentType="multipart/form-data"
class="org.apache.axis2.builder.MultipartFormDataBuilder"/ -->
<messageBuilder contentType="multipart/form-data"
class="org.wso2.carbon.relay.BinaryRelayBuilder"/>