Search code examples
jsonapache-cameljbossfuseblueprint-osgi

How to invoke a REST call (POST with JSON body) from Camel in blueprint


I want to call a POST rest service in camel blueprint. My blueprint xml file is the following:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:camel="http://camel.apache.org/schema/blueprint"
xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="      http://www.osgi.org/xmlns/blueprint/v1.0.0       https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd      http://camel.apache.org/schema/blueprint       http://camel.apache.org/schema/blueprint/camel-blueprint.xsd      http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider" id="jsonProvider"/>
<cxf:rsClient address="http://jsonplaceholder.typicode.com/posts"
    id="rsClient" loggingFeatureEnabled="true">
    <cxf:providers>
        <ref bean="jsonProvider" component-id="jsonProvider"/>
    </cxf:providers>
</cxf:rsClient>
<camelContext id="RESTCamelContext" xmlns="http://camel.apache.org/schema/blueprint">
    <route id="RESTRoute">
        <from id="_from1" uri="timer:foor?repeatCount=1"/>
        <to id="_to1" uri="log:body?level=INFO"/>
        <setHeader headerName="Content-Type" id="_setHeader1">
            <constant>application/json</constant>
        </setHeader>
        <setHeader headerName="Exchange.HTTP_METHOD" id="_setHeader2">
            <constant>POST</constant>
        </setHeader>

        <to id="_to2" uri="cxfrs:bean:rsClient"/>
        <to id="_to3" uri="log:body?level=INFO"/>
    </route>
</camelContext>

but I don't know how to pass the JSON object in the body request.


Solution

  • The easiest way would be to use HTTP4 component:

    <setHeader headerName="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <setBody>  make your POJO here </setBody>
    <marshal>
        <json library="Jackson" />
    </marshal>
    <to uri="http4://jsonplaceholder.typicode.com/posts"/>