Archive for category REST

MSDeploy Setup Guide & How to Call Server Side Method Using jQuery/Ajax

Couple of interesting items popped up in the RRS feed’s this morning.

Automating Deployment with Microsoft Web Deploy – ScottGu’s Blog.

Calling Server Side Method Using jQuery/Ajax – Karan’s Blog.

No Comments

Getting started with WCF and REST web services

I’m building some REST WCF services at the moment and found this great guide online www.robbagby.com/rest/rest-in-wcf-blog-series-index

The HiREST stuff shows you how to create fully fledged REST services utilising all of the HTTP verbs.

Heres a quick summary of the most useful bits;

The service itself is just added to the project as a normal WCF service. The following needs adding to the Web.config to setup the end

points;

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="AJAXFriendly">
        <enableWebScript />
      </behavior>
      <behavior name="RESTFriendly">
        <webHttp />
      </behavior>
    </endpointBehaviors>
</behaviors>

<services>
    <service      name="MyNamespace.AjaxServiceClassName">
      <endpoint   address=""
        behaviorConfiguration="AJAXFriendly"
        binding="webHttpBinding"
        contract="CatalogService" />
    </service>
    <service      name="MyNamespace.RESTServiceClassName">
      <endpoint   address=""
        behaviorConfiguration="RESTFriendly"
        binding="webHttpBinding"
        contract="MyNamespace.IRESTServiceInterfaceName" />
    </service>
  </services>
</system.serviceModel>

Remember the class names in the web.config need to be fully qualified.

An example class for passing around the service;

[DataContract]
public class ProductData
{
    [DataMember]
    public int ProductId;

    [DataMember]
    public string ProductName;

    [DataMember]
    public string Description;

    [DataMember]
    public decimal Price;

    [DataMember]
    public string ProductImage;
}

The service itself is just a normal WCF service so consists of its usual two parts- the interface and the class. Here’s an example interface

demoing the various access methods and return serialisations;

    [ServiceContract]
    public interface IRESTServiceInterfaceName
    {
        // responds to a GET request to www.mysite.com/Servicename.svc/products/
        // return is serialised to JSON  
        [OperationContract]
        [WebGet(UriTemplate = "products/", ResponseFormat = WebMessageFormat.Json)]
        List<FlotChartSeries> GetProducts();

        // responds to a GET request to www.mysite.com/Servicename.svc/products/{product_id}
        // return is serialised to JSON  
        [OperationContract]
        [WebGet(UriTemplate = "products/{product_id}", ResponseFormat = WebMessageFormat.Json)]
        List<FlotChartSeries> GetProductById(string product_id);

        // responds to a GET request to www.mysite.com/Servicename.svc/products?brand={brand}
        // return is serialised to JSON  
        [OperationContract]
        [WebGet(UriTemplate = "products?brand={brand}", ResponseFormat = WebMessageFormat.Json)]
        List<FlotChartSeries> GetProductsByBrand(string brand);

	// responds to a POST, but still passing a bunch of parameters into the querystring
	// no return type
        [WebInvoke(Method = "POST", UriTemplate = "product/{product_id}/rate?score={score}")]
        [OperationContract]
        void PostProductAppRating(string product_id, string score);

	// accepts a POST with a JSON encoded product data, to allow for an update
	// no return
	[WebInvoke(Method = "POST", UriTemplate = "product/{product_id}", RequestFormat = WebMessageFormat.Json)]
	void PostProductUpdate(string product_id, ProductData data);

	//responds to a PUT- passing a querystring variable for the filename- it expects the body of the push request to be a file stream
	// no return type
        [WebInvoke(Method = "PUT", UriTemplate = "products/{product_id}/desktopimage?filename={file_name}")]
        [OperationContract]
        void PutProductImage(string product_id, string file_name, Stream fileContents);
	
    }

Note the variables in the curly braces must match the real parameters to the method signitures for the value to be automatically mapped.

Responses are generally done using HTTP response codes. At the top of each method you need to grab the current WebOperationContext which

will allow you to set the return codes;

    WebOperationContext ctx = WebOperationContext.Current;

    ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;		// .. if everything is ok!
    ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.BadRequest;	// on error
    ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created;	// after an insert

    // all of the http response codes are mapped here

    ctx.OutgoingResponse.SetStatusAsNotFound(); // if record cannot be found or similar

, ,

No Comments