REST is stands for
REpresentational
State
Transfer. REST is the underlying architecture of web.
It is basically the HTTP protocol, which was originally created to
allow representational state transfer, not just transfer of web pages.
HTTP is most commonly used to
GET content and
POST data. But it can also
be used to
PUT and
DELETE data, as well as get Header information, etc
With this post I am going to create new web service that interact with data(xml) and going to make that web service into RESTFul web service
Create Web Service.
1. Open Visual Studio and goto ->
New ->
WCF ->
WCF Service Application
2. Go to
Solution explorer and select two files
IService1.cs and
Service1.svc and delete them.(If you need you can keep them)
3. Then Press
CTRL+SHIFT+A and Select
Visual C# and
WCF Service. Then give name for the service. Lets use it as
demo_REST and
Add
3. Lets open up the two files
demo_REST.svc and
demo_REST.cs and change its only funtion DoWork() to return string as output.
To do that first change the
demo_REST.cs file's doWork as this.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace REST_Demo
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "Idemo_REST" in both code and config file together.
[ServiceContract]
public interface Idemo_REST
{
[OperationContract]
string DoWork();
}
}
Then go to the
demo_REST.svc and edit it as follow. Just need to change return type and add code to middle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace REST_Demo
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "demo_REST" in code, svc and config file together.
// NOTE: In order to launch WCF Test Client for testing this service, please select demo_REST.svc or demo_REST.svc.cs at the Solution Explorer and start debugging.
public class demo_REST : Idemo_REST
{
//change public void DoWork() to public string DoWork()
public string DoWork()
{
//add return text
return "Hello WCF";
}
}
}
now we are done with our simple WCF
run and test it ..
its open in
WCF test Client from WCF test Client select the function that we create
DoWork() amd click on it then click on
invoke button to test it
In Value column it will display the results .. its "Hello WCF" and our function is working..
Implementing data bound Web service
I am not going details about databounded web services. My previous article
Web service with DB interaction provided good demonstration about how to work with DB data.
Here I am going to bind the XML file with it. I got the xml data from W3Schools (
http://www.w3schools.com/xml/cd_catalog.xml)
In Visual Studio
CTRL+SHIFT+A then select
Data and select
XML File and name it as
cd_data.xml then copy paste the XML data from W3Schools to the XML body.
Now
cd_data.xml is look likes this
<?xml version="1.0" encoding="utf-8" ?>
!-- Edited by XMLSpy --><CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<CD>
<TITLE>Still got the blues</TITLE>
<ARTIST>Gary Moore</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin records</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Eros</TITLE>
<ARTIST>Eros Ramazzotti</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>BMG</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>One night only</TITLE>
<ARTIST>Bee Gees</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1998</YEAR>
</CD>
<CD>
<TITLE>Sylvias Mother</TITLE>
<ARTIST>Dr.Hook</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS</COMPANY>
<PRICE>8.10</PRICE>
<YEAR>1973</YEAR>
</CD>
<CD>
<TITLE>Maggie May</TITLE>
<ARTIST>Rod Stewart</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Pickwick</COMPANY>
<PRICE>8.50</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Romanza</TITLE>
<ARTIST>Andrea Bocelli</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.80</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>When a man loves a woman</TITLE>
<ARTIST>Percy Sledge</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Black angel</TITLE>
<ARTIST>Savage Rose</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Mega</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>1999 Grammy Nominees</TITLE>
<ARTIST>Many</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Grammy</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1999</YEAR>
</CD>
<CD>
<TITLE>For the good times</TITLE>
<ARTIST>Kenny Rogers</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>Tupelo Honey</TITLE>
<ARTIST>Van Morrison</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1971</YEAR>
</CD>
<CD>
<TITLE>Soulsville</TITLE>
<ARTIST>Jorn Hoel</ARTIST>
<COUNTRY>Norway</COUNTRY>
<COMPANY>WEA</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>The very best of</TITLE>
<ARTIST>Cat Stevens</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Island</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Stop</TITLE>
<ARTIST>Sam Brown</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>A and M</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Bridge of Spies</TITLE>
<ARTIST>T'Pau</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Siren</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Private Dancer</TITLE>
<ARTIST>Tina Turner</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Capitol</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Midt om natten</TITLE>
<ARTIST>Kim Larsen</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Medley</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Pavarotti Gala Concert</TITLE>
<ARTIST>Luciano Pavarotti</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>DECCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1991</YEAR>
</CD>
<CD>
<TITLE>The dock of the bay</TITLE>
<ARTIST>Otis Redding</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Picture book</TITLE>
<ARTIST>Simply Red</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Elektra</COMPANY>
<PRICE>7.20</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Red</TITLE>
<ARTIST>The Communards</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>London</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Unchain my heart</TITLE>
<ARTIST>Joe Cocker</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>EMI</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1987</YEAR>
</CD>
</CATALOG>
Now we need to have some method to access those data n service.
Open demo_REST.cs and inside the
interface Idemo_REST add operation contract we named it as GetCatalog(). and we are going to return catalog data as JSON string then our return type for the GetCatalog() should be string.
namespace REST_Demo
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "Idemo_REST" in both code and config file together.
[ServiceContract]
public interface Idemo_REST
{
[OperationContract]
string DoWork();
//our newly added operation contract.
[OperationContract]
string GetCatelog();
}
}
Lets implement the logic behind that interface function in
Open demo_REST.svc
Now its look like this
public class demo_REST : Idemo_REST
{
//change public void DoWork() to public string DoWork()
public string DoWork()
{
//add return text
return "Hello WCF";
}
/// <summary>
/// Code behind the Operation contract
/// </summary>
/// <returns></returns>
public string GetCatelog()
{
//Read the XML File.. *You need to give XML file as URL
//Get all items in XML file to the code
var allItems = from data in xmlDataSheet.Descendants("CD")
select new
{
Title = data.Element("TITLE").Value,
Artist = data.Element("ARTIST").Value,
Country = data.Element("COUNTRY").Value,
Company = data.Element("COMPANY").Value,
Price = data.Element("PRICE").Value,
Year = data.Element("YEAR").Value
};
//Json Serializer initiation
JavaScriptSerializer toJson = new JavaScriptSerializer();
//convert the data in the xml to list and convert them as JSON string
return toJson.Serialize(allItems.ToList());
}
}
Run and check Our new addition is working or not.
Make It RESTful
With our Web service Most hard part is done and now we nee to make our web service as restful service. For easyness of understanding the REST I'm using string parameter to th
e GetCatelog()
method Now its look like GetCatelog(string Parameter) in both
Open demo_REST.cs and
Open demo_REST.svc files.
To make our web service REST enable we need to add Web Invoked functionality to service. Lets consider the HTTP GET here.
//our newly added operation contract.
//We need output as json and input text is as json and our GET Url is /GetCatelog?para=textInput
//Make sure you add correct parameter to correct input when working with multiple parameters
//You can try different methods
[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json,
UriTemplate = "GetCatelog?para={Parameter}")]
string GetCatelog(string Parameter);
Here is POST
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json,
UriTemplate = "GetCatalog")]
Lets make it happen..
In final step you need to make sure few things configured correctly. configurations are on
web.config file.
To make sure our endpoint of web service getting the JSON out put we need to add endpoint behavior to the web.config under <behaviors> tag
<!--End point json behavior-->
<endpointBehaviors>
<behavior name="jsonbehavior">
<webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json"/>
</behavior>
</endpointBehaviors>
Under the <system.servicemodel> tag we need to add and configure our web service to enable HTTP (REST) and endpoint behaviors
<services >
<!--adding service configuration-->
<service name="REST_Demo.demo_REST" >
<endpoint
address=""
binding="webHttpBinding"
behaviorConfiguration="jsonbehavior"
contract="REST_Demo.Idemo_REST" />
</service>
</services>
We are done.. then run and test your service in browser
Here is my credentials.
http://localhost:55173/demo_REST.svc/GetCatelog?para=text
Result
Full Code
http://bit.ly/wcfREST