Skip to main content

TOTD #57: Jersey Client API - simple and easy to use

Posted by arungupta on November 26, 2008 at 6:03 AM PST

href="http://blogs.sun.com/arungupta/entry/totd_56_simple_restful_web">TOTD
#56 explains how to create a RESTful Web service endpoint
using Jersey
and publish the resource using JSON representation. The blog entry
showed how the endpoint can be accessed from a Web browser. This style="font-weight: bold;">Tip style="font-weight: bold;">Of style="font-weight: bold;">The style="font-weight: bold;">Day explains how to
use Jersey
Client APIs
to invoke the published endpoint.



Lets get started!

  1. Create a new directory
    "./src/test/java/org/glassfish/samples"
  2. Add a test
    1. Add a template test file "AppTest.java" as shown below:


      style="text-align: left; background-color: rgb(204, 204, 255); width: 100%;"
      cellpadding="2" cellspacing="2">
      package org.glassfish.samples;



      import junit.framework.Test;

      import junit.framework.TestCase;

      import junit.framework.TestSuite;



      /**

       * Unit test for simple App.

       */

      public class AppTest

          extends TestCase

      {

          /**

           * Create the test case

           *

           * @param testName name of the
      test case

           */

          public AppTest( String testName )

          {

             
      super( testName );

          }



          /**

           * @return the suite of tests
      being tested

           */

          public static Test suite()

          {

             
      return new TestSuite( AppTest.class );

          }



          /**

           * Rigourous Test :-)

           */

          public void testApp()

          {

              assertTrue(true);

          }

      }
    2. Add a new method "createResource()" as:


      style="text-align: left; background-color: rgb(204, 204, 255); width: 100%;"
      cellpadding="2" cellspacing="2">
          private
      WebResource createResource() {

             
      Client client = Client.create();

             
      WebResource resource =
      client.resource("http://localhost:8080/helloworld-webapp/webresources/myresource");

             
      return resource;

          }



      This code creates a default instance of Jersey Client and creates a Web
      resource from that client for the URI passed as an argument.

    3. Change the implementation of "testApp()" method as:


      style="text-align: left; background-color: rgb(204, 204, 255); width: 100%;"
      cellpadding="2" cellspacing="2">
             
      Greeting result = createResource().get(Greeting.class);

             
      assertTrue(result.greeting.equals("Hi there!"));



      This invokes the
      GET method on the resource by passing specific type and compares the
      returned and expected value.

    4. Add the following "imports":


      style="text-align: left; background-color: rgb(204, 204, 255); width: 100%;"
      cellpadding="2" cellspacing="2">
      import com.sun.jersey.api.client.Client;

      import com.sun.jersey.api.client.WebResource;
    5. Copy "Greeting.java" from TOTD #56
      to "./src/test/java/org/glassfish/samples"
      directory.
  3. Run the test
    1. Deploy the endpoint as "mvn glassfish:run".
    2. Run the test as "mvn test". The following output is shown:


      style="text-align: left; background-color: rgb(204, 204, 255); width: 100%;"
      cellpadding="2" cellspacing="2">
      ~/samples/jersey/helloworld-webapp > style="font-weight: bold;">mvn test

      [INFO] Scanning for projects...

      [INFO]
      ------------------------------------------------------------------------

      [INFO] Building helloworld-webapp Jersey Webapp

      [INFO]    task-segment: [test]

      [INFO]
      ------------------------------------------------------------------------

      [INFO] [resources:resources]

      [INFO] Using default encoding to copy filtered resources.

      [INFO] [compiler:compile]

      [INFO] Nothing to compile - all classes are up to date

      [INFO] [resources:testResources]

      [INFO] Using default encoding to copy filtered resources.

      [INFO] [compiler:testCompile]

      [INFO] Compiling 1 source file to
      /Users/arungupta/samples/jersey/helloworld-webapp/target/test-classes

      [INFO] [surefire:test]

      [INFO] Surefire report directory:
      /Users/arungupta/samples/jersey/helloworld-webapp/target/surefire-reports



      -------------------------------------------------------

       T E S T S

      -------------------------------------------------------

      Running org.glassfish.samples.AppTest

      Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.587
      sec



      Results :



      Tests run: 1, Failures: 0, Errors: 0, Skipped: 0



      [INFO]
      ------------------------------------------------------------------------

      [INFO] BUILD SUCCESSFUL

      [INFO]
      ------------------------------------------------------------------------

      [INFO] Total time: 4 seconds

      [INFO] Finished at: Mon Nov 24 16:50:17 PST 2008

      [INFO] Final Memory: 18M/43M

      [INFO]
      ------------------------------------------------------------------------
  4. View request and response messages
    1. Change the implementation of "createResource()" method as
      (changes highlighted in bold):


      style="text-align: left; background-color: rgb(204, 204, 255); width: 100%;"
      cellpadding="2" cellspacing="2">
             
      Client client = Client.create();

             
      WebResource resource =
      client.resource("http://localhost:8080/helloworld-webapp/webresources/myresource");

              style="font-weight: bold;">resource.addFilter(new
      LoggingFilter());

             
      return resource;
    2. Running the tests as "mvn test" now shows the output,
      with request and response messages, as shown below:


      style="text-align: left; background-color: rgb(204, 204, 255); width: 100%;"
      cellpadding="2" cellspacing="2">
      Running org.glassfish.samples.AppTest

      1 * Out-bound request

      1 > GET
      http://localhost:8080/helloworld-webapp/webresources/myresource

      1 >

      1 < 200

      1 < X-Powered-By: Servlet/2.5

      1 < Transfer-Encoding: chunked

      1 < Content-Type: application/json

      1 < Server: GlassFish/v3

      1 < Date: Tue, 25 Nov 2008 07:07:51 GMT

      1 <

      {"greeting":"Hi there!"}

      1 * In-bound response

      Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.074
      sec

Really easy!



Even though the APIs are used to invoke a RESTful endpoint deployed
using Jersey but are very generic and can be used to invoke any RESTful
endpoint. href="http://blogs.sun.com/sandoz/entry/jersey_client_api">Paul's
blog explain in detail on the usage. You can also see how
these APIs can be used to href="http://blog.beuchelt.org/2008/07/18/Using+Abdera+And+The+Jersey+Client+API.aspx">consume
a service hosted using Apache Abdera.



href="https://jersey.dev.java.net/source/browse/*checkout*/jersey/tags/jersey-1.0/api/jersey/com/sun/jersey/api/client/package-frame.html">com.sun.jersey.api.client,
href="https://jersey.dev.java.net/source/browse/*checkout*/jersey/tags/jersey-1.0/api/jersey/com/sun/jersey/api/client/config/package-frame.html">com.sun.jersey.api.client.config,
and href="https://jersey.dev.java.net/source/browse/*checkout*/jersey/tags/jersey-1.0/api/jersey/com/sun/jersey/api/client/filter/package-frame.html">com.sun.jersey.api.client.filter
packages documents all the classes that provide support for client-side
communication with HTTP-based RESTful Web services.



Technorati: totd
glassfish
v3 href="http://technorati.com/tag/embeddable">embeddable
jersey
jsr311
rest href="http://technorati.com/tag/json">json href="http://technorati.com/tag/webservices">webservices

Related Topics >>