0
votes

I want to call external REST service that return a JSON, the REST itself have a basic authentication (which I don't know how to send a basic authentication), I've read some tutorial and also CXFRS component that lead me to this blueprint.xml.

<?xml version="1.0" encoding="UTF-8"?>

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cxf="http://camel.apache.org/schema/cxf"
       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xsi:schemaLocation="
       http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

  <bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider"/>

  <cxf:rsClient id="rsClient" address="http://localhost/test.php">
    <cxf:providers>
      <ref bean="jsonProvider"/>
    </cxf:providers>
  </cxf:rsClient>

  <camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <propertyPlaceholder location="classpath:sql.properties" id="placeholder"/>

    <route>
      <from uri="cxfrs://bean://rsClient"/>
      <log message="${body}"/>
    </route>

  </camelContext>

</blueprint>

If it's even relevant, I'm using JBoss Developer Studio to develop and to test using right click on blueprint.xml -> Run As -> Local Camel Context (without tests) here is output from that.

[ERROR] *************************************
[ERROR] Error occurred while running main from: org.apache.camel.test.blueprint.Main
[ERROR] 
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.camel.maven.RunMojo$1.run(RunMojo.java:488)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: Gave up waiting for service (objectClass=org.apache.camel.CamelContext)
    at org.apache.camel.test.blueprint.CamelBlueprintHelper.getOsgiService(CamelBlueprintHelper.java:265)
    at org.apache.camel.test.blueprint.CamelBlueprintHelper.getOsgiService(CamelBlueprintHelper.java:226)
    at org.apache.camel.test.blueprint.Main.doStart(Main.java:110)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.main.MainSupport.run(MainSupport.java:150)
    at org.apache.camel.main.MainSupport.run(MainSupport.java:354)
    at org.apache.camel.test.blueprint.Main.main(Main.java:84)
    ... 6 more
[ERROR] *************************************
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:07 min
[INFO] Finished at: 2016-10-04T12:11:28+07:00
[INFO] Final Memory: 30M/314M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.camel:camel-maven-plugin:2.15.1.redhat-621084:run (default-cli) on project dsource: null: MojoExecutionException: InvocationTargetException: Gave up waiting for service (objectClass=org.apache.camel.CamelContext) -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Apart the error I got, how exactly I can call or invoke REST service from Apache Camel using Blueprint and get the returned JSON?

1
I would think it is far easier to use the rest dsl to simple rest operations. See here: camel.apache.org/rest-dsl.html . Also, any reason you are using the red hat version?Souciance Eqdam Rashti
Is Rest DSL actually just to define or create REST server service? not consume or invoke external REST service? Because the company I work put RedHat JBoss as the requirement of our integration. Oh by the way, while looking at Rest DSL there is camel-jetty, can I use that?Adam

1 Answers

1
votes

I solved this, but using Camel HTTP component, I can easily call REST API and get the JSON response, but first I have to set some header before.

<route>
  <from uri="timer:foo?repeatCount=1"/>

  <setHeader headerName="Exchange.HTTP_METHOD">
    <constant>GET</constant>
  </setHeader>

  <to uri="http:localhost/api/test"/>
  <log message="${body}"/>
</route>