<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Apache Wink : 6.1 Getting Started with Apache Wink Client</title>
	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
        <META http-equiv="Content-Type" content="text/html; charset=UTF-8">	    
    </head>

    <body>
	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
		    <tr>
			    <td valign="top" class="pagebody">
				    <div class="pageheader">
					    <span class="pagetitle">
                            Apache Wink : 6.1 Getting Started with Apache Wink Client
                                                    </span>
				    </div>
				    <div class="pagesubheading">
					    This page last changed on Oct 13, 2009 by <font color="#0050B2">michael</font>.
				    </div>

				    <h2><a name="6.1GettingStartedwithApacheWinkClient-GettingStartedwiththeApacheWinkClient"></a>Getting Started with the Apache Wink Client</h2>

<p>The following section details the getting started examples that demonstrate how to write a simple client that consume RESTful Web Services with the Apache Wink Client.</p>

<h3><a name="6.1GettingStartedwithApacheWinkClient-GETRequest"></a>GET Request</h3>

<p>The following example demonstrates how to issue an Http GET request.</p>


<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">// create the rest client instance
1  RestClient client = new RestClient();

// create the resource instance to interact with
2  Resource resource = client.resource(<span class="code-quote">"http://services.com/HelloWorld"</span>);
// perform a GET on the resource. The resource will be returned as plain text
3  String response = resource.accept(<span class="code-quote">"text/plain"</span>).get(String.class);
</pre>
</div></div>

<h4><a name="6.1GettingStartedwithApacheWinkClient-Explanation"></a>Explanation</h4>

<p>The RestClient is the entry point for building a RESTful Web Service client. In order to start working with the Wink Client, a new instance of RestClient needs to be created, as the example shows in line 1 of the example. A new Resource is then created with the given URI, by calling the RestClient#resource() method as appears in line 2.</p>

<p>Finally, the Resource#get() method is invoked in order to issue an Http GET request as appears in line 3.<br/>
Once the Http response is returned, the client invokes the relevant provider to desterilizes the response in line 3.</p>

<h3><a name="6.1GettingStartedwithApacheWinkClient-POSTRequest"></a>POST Request</h3>

<p>The following example demonstrates how to issue an Http POST request.</p>


<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">// create the rest client instance
1  RestClient client = new RestClient();

// create the resource instance to interact with
2  Resource resource = client.resource(<span class="code-quote">"http://services.co"</span>);

// issue the request
3  String response = resource.contentType(<span class="code-quote">"text/plain"</span>).accept(<span class="code-quote">"text/plain"</span>).post(String.class, <span class="code-quote">"foo"</span>);
</pre>
</div></div>

<h4><a name="6.1GettingStartedwithApacheWinkClient-Explanation"></a>Explanation</h4>

<p>The POST Request example demonstrates how to issue a simple Http POST request that sends and receives resources as strings.</p>

<p>First, a new instance of a Resource is created through the RestClient. The Http POST request is then issued by specifying the request and response media types and the response entity type (String.class).</p>

<h3><a name="6.1GettingStartedwithApacheWinkClient-POSTAtomRequest"></a>POST Atom Request</h3>

<p>The following example demonstrates how to issue an Http POST request that sends and receives atom entries.</p>


<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">// create the rest client instance
1  RestClient client = new RestClient();

// create the resource instance to interact with
2  Resource resource = client.resource(<span class="code-quote">"http://services.co"</span>);

3  AtomEntry request = getAtomEntry();

// issue the request
4  AtomEntry response = resource.contentType(<span class="code-quote">"application/atom+xml"</span>).accept(<span class="code-quote">"application/atom+xml"</span>).post(AtomEntry.class, request);
</pre>
</div></div>

<h4><a name="6.1GettingStartedwithApacheWinkClient-Explanation"></a>Explanation</h4>

<p>The Apache Wink Client provides an object model for Atom (atom feed and atom entry), and supplies out-of-the-box providers that enable sending and receiving atom feeds and entries.</p>

<h3><a name="6.1GettingStartedwithApacheWinkClient-UsingClientResponse"></a>Using ClientResponse</h3>

<p>The following example demonstrates how to use the ClientResponse object in order to de-serialize the response entity.</p>



<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">// create the rest client instance
1  RestClient client = new RestClient();

// create the resource instance to interact with
2  Resource resource = client.resource(<span class="code-quote">"http://services.co"</span>);

// issue the request
3  ClientResponse response = resource.accept(<span class="code-quote">"text/plain"</span>).get();

// deserialize response
4  String responseAsString = response.getEntity(String.class);
</pre>
</div></div>

<h4><a name="6.1GettingStartedwithApacheWinkClient-Explanation"></a>Explanation</h4>

<p>If the response entity type is not provided when invoking the Resource#get() method that appears in line 3, the response will be returned as the raw ClientResponse. In order to trigger the response deserialization mechanism, the ClientResponse#getEntity() method needs to be invoked as it appears in line 4 with the required response entity type.</p>

				    
                    			    </td>
		    </tr>
	    </table>
	    <table border="0" cellpadding="0" cellspacing="0" width="100%">
			<tr>
				<td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="images/border/spacer.gif" width="1" height="1" border="0"/></td>
			</tr>
		    <tr>
			    <td align="center"><font color="grey">Document generated by Confluence on Nov 11, 2009 06:57</font></td>
		    </tr>
	    </table>
    </body>
</html>