简体   繁体   中英

MuleESB to consume REST API

I'm new to Mulesoft development. Recently I'm asked to develop a MuleESB application to read some values from a comma-delimited CSV file and then call a REST API with the values provided. I'm not sure if I'm doing it correctly or on the right path towards achieving that as I keep getting this WARN 2016-08-03 02:39:49,209 [creditsFlow.stage1.02] org.mule.routing.ExpressionSplitter: Splitter returned no results. If this is not expected, please check your split expression and nothing happens next.

Usually this is how we call the REST API: https://xx.xx.com/server/CreditPost/views/CreditPost?ID=12345678&CompletionDt=2017-08-03&CourseNbr=90000001

Below is the snippet of my MuleESB code:

    <flow name="creditsFlow">
        <file:inbound-endpoint path="C:\Users\kteo1\Downloads\Inbound" responseTimeout="10000" metadata:id="a67520d0-f60d-4b5c-9fc8-3578d6c6434d" doc:name="input file" mimeType="application/csv">
            <file:filename-regex-filter pattern="credits_(?:(?!\.csv)(?:.|\n))*\.csv" caseSensitive="true"/>
        </file:inbound-endpoint>
        <dw:transform-message metadata:id="0e395c12-6af5-4894-b9c2-f7642816f8d3" doc:name="CSV to XML">
            <dw:input-payload doc:sample="list_credits.csv"/>
            <dw:set-payload><![CDATA[%dw 1.0
%output application/xml
---
{
    credits: {
        (payload map ((payload01 , indexOfPayload01) -> {
            credit: {
                ID: payload01.ID,
                CourseNbr: payload01.CourseNbr,
                CompletionDt: payload01.CompletionDt as :string
            }
        }))
    }
}]]></dw:set-payload>
        </dw:transform-message>
        <json:xml-to-json-transformer doc:name="XML to JSON"/>
        <logger message="#[message.payload]" level="INFO" doc:name="Logger"/>
        <json:json-to-object-transformer  doc:name="JSON to Object"/>
        <set-variable variableName="totalCredits" value="#[json:credits]" doc:name="totalCredits"/>
        <set-variable variableName="creditsArrayList" value="#[new java.util.ArrayList()]" doc:name="creditsArrayList"/>
        <foreach collection="#[json:credit]" doc:name="For Each" >
            <logger message="#[json:ID]" level="INFO" doc:name="Logger"/>
            <http:request config-ref="HTTP_Request_Configuration" path="/server/CreditPost/views/CreditPost?ID={ID}&amp;CompletionDt={CompletionDt}&amp;CourseNbr={CourseNbr}" method="GET" doc:name="HTTP">
                <http:request-builder>
                    <http:uri-param paramName="ID" value="#[json:ID]"/>                    
                    <http:uri-param paramName="CompletionDt" value="#[json:CompletionDt]"/>
                    <http:uri-param paramName="CourseNbr" value="#[json:CourseNbr]"/>
                </http:request-builder>
            </http:request>
        </foreach>
    </flow>

Please advise.

First you dont need transform data to xml and then to json and then to java.

Use something like

%dw 1.0
%output application/java
---
(payload map ((payload01 , indexOfPayload01) -> {
    ID: payload01.ID,
    CourseNbr: payload01.CourseNbr,
    CompletionDt: payload01.CompletionDt as :string
}))

It will produce arraylist pass it to request builder. Another issue is regarding uri-params. You are using uri-pamars instead use query params and access fields like #[payload.ID], #[payload.CourseNbr], #[payload.CompletionDt] while setting query params.

        <dw:transform-message doc:name="Transform Message" metadata:id="55f04db1-ed48-4e1f-b966-562768a3c173">
        <dw:input-payload doc:sample="list_csv.csv">
            <dw:reader-property name="header" value="false"/>
        </dw:input-payload>
        <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
(payload map ((payload01 , indexOfPayload01) -> {
    ID: payload01.ID,
    CourseNbr: payload01.CourseNbr,
    CompletionDt: payload01.CompletionDt as :string
}))

]]></dw:set-payload>
    </dw:transform-message>
    <foreach doc:name="For Each">
        <http:request config-ref="HTTP_Request_Configuration" path="/server/CreditPost/views/CreditPost" method="GET" doc:name="HTTP">
            <http:request-builder>
                <http:query-param paramName="ID" value="#[payload.ID]"/>
                <http:query-param paramName="CourseNbr" value="#[payload.CourseNbr]"/>
                <http:query-param paramName="CompletionDt" value="#[payload.CompletionDt]"/>
            </http:request-builder>
        </http:request>
    </foreach>

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM