2

私は Mule ESB を初めて使用し、POST リクエストを REST サービスに送信しようとしています。リクエストの本文は文字列形式で、リクエストは x-www-form-urlencoded である必要があります。ペイロードをパラメーターに設定し、リクエストを REST サービスに送信しましたが、例外が発生しました。

Failed to invoke REST service "http://username:password@192.168.10.252/api/rest/session/login.json". Message payload is of type: String

私のレスト URL は: (#[restURL]) ${dms.host}/api/rest/session/login.json

私のパラメーターは (ペイロード #[restBody] として設定): username=user&password=pass

<sub-flow name="RESTrequestToDMS" doc:name="RESTrequestToDMS" processingStrategy="synchronous">
    <set-variable variableName="originalMessage" value="#[payload]" doc:name="Backup original message"/>
    <logger message="#[restBody]" level="INFO" doc:name="Logger"/>
    <choice doc:name="Choice">
        <when expression="restHTTPmethod == 'POST'">
            <processor-chain>    
                <set-payload value="#[restBody]" doc:name="Set Payload"/>           
                <http:rest-service-component httpMethod="POST" serviceUrl="http://${dms.user}:${dms.pass}@#[restURL]"></http:rest-service-component>
            </processor-chain>
        </when>
        <when expression="restHTTPmethod == 'GET'">
            <processor-chain>
                <http:rest-service-component httpMethod="GET" serviceUrl="http://${dms.user}:${dms.pass}@#[restURL]?#[restBody]"></http:rest-service-component>
            </processor-chain>
        </when>
        <otherwise>
            <processor-chain>
                <logger message="Unknown http method type is provided! " level="ERROR" doc:name="Logger"/>
            </processor-chain>
        </otherwise>
    </choice>
    <json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/>
    <echo-component doc:name="Echo"/>
    <set-variable variableName="RESTResponse" value="#[payload]" doc:name="set RESTResponse"/>
    <set-payload value="#[flowVars['originalMessage']]" doc:name="Restore Original Message"/>
</sub-flow>

誰かがこれを理解するのを手伝ってくれますか?

よろしくお願いします。

注: David の返信に従って更新されました。

- - - - - - - - - -アップデート - - - - - - - - - -

そこで、テスト目的で、フローを次のように変更しました。

<set-payload value="#[restBody]" doc:name="Set Payload"/>
<custom-transformer class="de.mfg.osii.http.StringToURIParametersMapTransformer" doc:name="String To URI Parameters"/>  
<http:rest-service-component httpMethod="POST" serviceUrl="http://${dms.user}:${dms.pass}@#[restURL]">
    <http:requiredParameter key="username" value="#[payload.get('username')]" />
    <http:requiredParameter key="password" value="#[payload.get('password')]" />
</http:rest-service-component>  

したがって、ペイロードは次のようになります: {username=user, password=pass} しかし、これを実行しようとすると、次のエラーが発生します。

1. Failed to invoke REST service "http://user:pass@192.168.10.252/api/rest/session/login.json". Message payload is of type: LinkedHashMap (org.mule.transport.http.components.RestServiceException)

更新:上記の問題 (例外) は、値「application/x-www-form-urlencoded」を持つメッセージ プロパティ「Content-Type」を追加することで解決されました。

以下の最後の部分は、まだ私にとって謎のままです:)

もう1つは、Davidの回答へのコメントで述べたように、残りのコンポーネントに必要なパラメーターを適応的な方法で追加できますか? より明確にするために、異なるリクエストごとに異なるフローを作成したくありません。ペイロードにパラメーター マップがあるので、それらを繰り返し処理して必要なパラメーターに入れたいと思います。このようなことは可能ですか?

よろしくお願いします!

- - - - - - - - - -アップデート - - - - - - - - - -

そこで、フローを変更し、David の提案を使用しました。しかし、現在、HTTP 405 エラー (メソッドは許可されていません) が発生しています。しかし、正しいコンテンツタイプで正しいアドレスに投稿していると確信しています。これの理由は何ですか?誰かアイデアがありますか?

このフローに入るペイロードは、-> などの文字列 (URL エンコードされたパラメーター) です。

sessionId=9eub9gm7k7oc1ub81dhef6t46q&xml=%3CObjectList%3E%3CFolderObject%3E%3CAddToFolder%20RefType%3D%22Path%22%20ClassName%3D%22FolderObject%22%3E%3C!%5BCDATA%5B%2FfolderPath%5D%5D%3E%3C% 2FAddToFolder%3E%3CName%3E%3C!%5BCDATA%5Baaa%5D%5D%3E%3C%2FName%3E%3CDescription%3E%3C!%5BCDATA%5BRequests%20from%20user%20aaa%20are%20stored%20in% 20this%20folder%5D%5D%3E%3C%2FDescription%3E%3CNoErrorIfExist%2F%3E%3C%2FolderObject%3E%3C%2FObjectList%3E

<flow name="RESTrequestToDMS" doc:name="RESTrequestToDMS" processingStrategy="synchronous">
    <set-variable variableName="originalMessage" value="#[payload]" doc:name="Backup original message"/>
    <choice doc:name="Choice">
        <when expression="restHTTPmethod == 'POST'">
            <processor-chain>
                <set-payload value="#[restBody]" doc:name="Set Payload"/>
                <logger message="The payload before http post is: #[message.payload]" level="INFO" doc:name="Logger"/>
                <http:outbound-endpoint  exchange-pattern="request-response" doc:name="HTTP" address="http://#[restURL]"  user="${dms.user}" password="${dms.pass}" contentType="application/x-www-form-urlencoded">
                </http:outbound-endpoint>
            </processor-chain>
        </when>
        <when expression="restHTTPmethod == 'GET'">
            <processor-chain>
                <http:outbound-endpoint method="GET"  exchange-pattern="request-response" doc:name="HTTP" address="http://#[restURL]?#[restBody]"  user="${dms.user}" password="${dms.pass}" contentType="application/x-www-form-urlencoded">
        </http:outbound-endpoint>
            </processor-chain>
        </when>
        <otherwise>
            <processor-chain>
                <logger message="Unknown http method type is provided! " level="ERROR" doc:name="Logger"/>
            </processor-chain>
        </otherwise>
    </choice>
    <echo-component doc:name="Echo"/>
    <choice doc:name="Choice">
        <when expression="payload != null &amp;&amp; payload != empty &amp;&amp; payload != ''">
            <processor-chain>
                <json:json-to-object-transformer doc:name="JSON to Object" returnClass="java.util.Map"/>
                <set-variable variableName="RESTResponse" value="#[payload]" doc:name="set RESTResponse"/>
            </processor-chain>
        </when>
        <otherwise>
            <processor-chain>
                <logger message="The payload is null or empty! HTTP response code is: #[message.inboundProperties['http.status']]" level="INFO" doc:name="Logger"/>
                <set-variable variableName="RESTResponse" value="#[message.inboundProperties['http.status']]" doc:name="Set HTTP Status Code"/>
            </processor-chain>
        </otherwise>
    </choice>
    <set-payload value="#[flowVars['originalMessage']]" doc:name="Restore Original Message"/>
</flow> 
4

1 に答える 1