2013-11-25 23 views
1

我試圖調用一個預期會收到multipart/form-data的休息服務,並且我正面臨着一些問題。Mule http:outbound-endpoint + multipart/form-data

經過一段時間的搜索,我明白我必須將有效負載移動到出站附件並將有效負載設置爲空。

<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]" /> 

我也做了,但得到的錯誤:

我收到了內容類型錯誤: 消息:郵件包含MIME類型爲 「text/xml的」 當「的multipart/form-data的「預計。

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> 

回答

3

下面顯示瞭如何發佈一個多實體有兩個字段值:

<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否則騾子指定的值不會能夠在POST中提供多部分邊界。

如果你碰巧有出站範圍Content-Type消息財產,以將其刪除:在HTTP出站端點前

<remove-property propertyName="Content-Type" /> 

0

只有我使用Anypoint工作室3.5.2與騾子運行3.5.0補充,類org.mule.message.ds.StringDataSource的構造方法的簽名是不同的,而不是:

org.mule.message.ds.StringDataSource('key1''value1','text/plain');

org.mule.message.ds.StringDataSource( 'VALUE1', 'KEY1', '文本/純');