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!
- Create a new directory
"./src/test/java/org/glassfish/samples"
- Add a test
- 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);
}
} |
- 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.
- 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.
- 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;
|
- Copy "Greeting.java" from TOTD #56
to "./src/test/java/org/glassfish/samples"
directory.
- Run the test
- Deploy the endpoint as "mvn glassfish:run".
- 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]
------------------------------------------------------------------------ |
- View request and response messages
- 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;
|
- 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