我正在尝试调用一个希望接收多部分/表单数据的休息服务,但我遇到了一些问题。
经过一段时间的搜索,我明白我必须将有效负载移动到出站附件并将有效负载设置为空。
<expression-component><![CDATA[
ds = new org.mule.message.ds.StringDataSource(formdata,'payload','multipart/form-data');
dh = new javax.activation.DataHandler(ds);
message.outboundAttachments['payload'] = dh;
]]></expression-component>
<set-payload value="#[null]" />
我也做到了,但得到了错误:
我收到了内容类型错误: 消息:当期望“multipart / form-data”时,消息包含MIME类型“text / xml”。
Obs。:我不得不使用表达式组件,因为如果我只是使用set-attachment,我会收到“name must not null”错误。
由于此处的问题是内容的类型,我还尝试转换消息属性。
<message-properties-transformer overwrite="true" doc:name="Message Properties">
<add-message-property key="Content-Type" value="multipart/form-data;charset=utf-8"/>
</message-properties-transformer>
之后,我收到了其余服务的400错误。
我还尝试将多部分中的每个属性(键值)放在分离的附件中作为内容类型:text / plain,这里也是同样的问题。
我想我的问题是如何正确附加,以便内容类型成功转换为multipart / form-data。
我感谢任何帮助。感谢。
http出站呼叫代码:
<enricher source="#[message.inboundProperties['http.status']]" target="#[variable:out]" doc:name="Message Enricher">
<http:outbound-endpoint exchange-pattern="request-response" method="POST" host="${jbpm.host}" port="${jbpm.port}" path="#[address]" doc:name="HTTP" mimeType="multipart/form-data">
<response>
<object-to-string-transformer />
</response>
</http:outbound-endpoint>
</enricher>
<logger message="RESPONSE STATUS - #[variable:out]" level="INFO" doc:name="Logger"/>
<set-payload value="needAXml" doc:name="Set Payload"/>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" doc:name="XSLT">
<mulexml:xslt-text>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:bpmsws="http://www.arizona.com.br/esb/bpmsws/service/v1_0_0/"
xmlns:bpms="http://www.arizona.com.br/bpms/core/v1_0_0/">
<xsl:param name="responseStatus"/>
<xsl:template match="/">
<bpmsws:httpPostResponse>
<status xmlns=""><xsl:value-of select="$responseStatus" /></status>
</bpmsws:httpPostResponse>
</xsl:template>
</xsl:stylesheet>
</mulexml:xslt-text>
<mulexml:context-property key="responseStatus" value="#[variable:out]"/>
</mulexml:xslt-transformer>
答案 0 :(得分:3)
以下显示了如何使用两个字段值POST多部分实体:
<expression-component><![CDATA[
ds = new org.mule.message.ds.StringDataSource('key1','value1','text/plain');
dh = new javax.activation.DataHandler(ds);
message.outboundAttachments['key1'] = dh;
ds = new org.mule.message.ds.StringDataSource('key2','value2','text/plain');
dh = new javax.activation.DataHandler(ds);
message.outboundAttachments['key2'] = dh;
]]></expression-component>
<set-payload value="#[null]" />
<http:outbound-endpoint exchange-pattern="request-response"
method="POST" address="http://localhost:8082/path" />
小心不要为contentType
指定值,否则Mule将无法在POST中提供多部分边界。
如果您在出站范围内碰巧有Content-Type
消息属性,请将其删除:
<remove-property propertyName="Content-Type" />
在HTTP出站端点之前。
答案 1 :(得分:0)
为了补充我使用Anypoint Studio 3.5.2和mule runtime 3.5.0,类org.mule.message.ds.StringDataSource的构造函数的签名是不同的,而不是:
org.mule.message.ds.StringDataSource(&#39; key1&#39;&#39; value1&#39;,&#39; text / plain&#39;);
是
org.mule.message.ds.StringDataSource(&#39; value1&#39;,&#39; key1&#39;,&#39; text / plain&#39;);