RestLess - A Simple REST Framework Part 2

Posted on Wednesday, April 23, 2008

Some cool changes have come along for RestLess. Instead of blabbering on, I'll dive right into the changes.

Small naming changes

Based on Dave Donaldson's recommendation, IRESTReadable, RESTProperty, etc have their case changed. They are now IRestReadable, RestProperty, etc. Just do a rename all on REST to Rest if you already have implemented the framework.

No More Default.aspx, pretty urls!

A problem with the first version, was default.aspx was specified in the Url. This is ugly and not very RESTful. There is a new key you can add to web.config appSettings:

<add key="RestLess::GeneratePlaceholderDirs" value="true" />

When this value is set to true, RestLess will generate placeholder folders with an empty default.aspx document. This way you can specify the url as http://mysite.com/api/products/ (notice no default.aspx). Your web application directory will look something like below:

IRestWritable

IRestReadable, in the first version, allowed you to send an xml document down to a user submitting a GET request at the resource url. IRestWritable exposes one method void GetRestPostedObject(object obj). When a POST is submitted to the url/resource, this method will be called. The best thing about GetPostedObject(object obj) is that it will populate the object from querystring for you based on your RestProperty's. If the attribute is specified as IOType.Input or IOType.InputOutput, RestLess will look in the url for you to see if these values were passed by the user, then send you a populated object.

For example (copied the example object from the first version for clarity, new additions in orange)

    // decorate the class as a RestResource, the first parameter is the url of the resource
    // appended to the root url (defined in web.config). In this case /api/products/
    // the second parameter specifies if this resource is discoverable (more on this later)
   
[RestResource("products", true)]
    public class Product : IRestReadable, IRestWritable
    {
        private string _name;
        private string _description;
        private double _amount;

        // render this property as xmlelement "productname"
        // IOType.InputOutput specifies that this property will be rendered
        // to the outputted xml, and can also be inputted via querystring
       
[RestProperty("productname", IOType.InputOutput)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        // render this property as xmlelement "productdescription"
        // IOType.Output specifies this property is rendered to the user,
        // but it is not allowed in querystring for input
       
[RestProperty("productdescription", IOType.Output)]
        public string Description
        {
            get { return _description; }
            set { _description = value; }
        }

        // render this property as xmlelement "amount" (output only again)
       
[RestProperty("amount", IOType.InputOutput)
          public object GetRESTObject()
          {

              // this is where you could go access your data access layer or whatever
              //method you choose.
              // this is also where you could request an API key via querystring for security etc
              // since productname is specified inputoutput, you should check for
              // Request.QueryString["productname"] to get any data the user sends

              // for the purposes of this demo, lets just make an object and pass it back
              Product p = new Product();
              p.Name = "Super Fly Ink Pen";
              p.Description = "This is the most super fly ink pen ever";
              p.Amount = 10.00;

              return p;
          }

          #endregion

          #region IRestWritable Members

          public void GetRestPostedObject(object obj)
          {
              Product product = obj as Product;
  
              // product will be populated here based on anything provided in
QueryString.
              // you do not need to retrieve it manually. for example, if the POSTed url is
              // http://mysite.com/api/products/?productname=InkPen&amount=2.50

              product.Name // will equal InkPen
              product.Amount // will equal 2.50
          }
      
          #endregion

    }

Right now, IRestWritable only supports getting values from querystring. That will change later to support xml documents being posted, etc.

Grab the new dll here. (as of now, the plan is to open-source the framework when it's a little further along)

Enjoy!

Jayme

kick it on DotNetKicks.com

Comments

  • Scott Watermasysk on 4.24.2008 at 11:54 AM
  • What if IRestWritable as an empty interface? If it exists, your base page/httpModule would attempt to set the properties it discovers (via reflection).

    In addition, updates should leverage a post and not the querystring.

  • Jayme on 4.24.2008 at 1:39 PM
  • It does set the properties via reflection and pass the object to GetRestPostedObject(). If the interface was empty, how would you know the user posted anything at all?

    And yes - I agree on the post part. I would like to make it querystring, xml, json, etc all optional. Whatever the developer chooses.

  • Mycall on 5.01.2008 at 8:15 PM
  • Great library, keep up the good work.

    Keep in mind, RESTful interfaces do not have ? or & in the URL as those represent state and not a single resource.

    mysite.com/.../products

    should be

    mysite.com/.../2.50

    check out these articles as they might give you some good ideas:

    www.xml.com/.../rest.html http://www.w3.org/2001/tag/doc/hash-in-url zwah.com/.../rest-reduced-to

    Cheers!

  • Martin on 8.19.2008 at 5:26 PM
  • Hi Jayme

    I am interested in what you have done here and am wondering if you have made any progress of late.

    I see the artical is 23 April and we are now in August.

    Would like to know if this is evolving or RESTED(pardon the pun.)

    Thanks

    Martin

  • ricky on 5.07.2009 at 1:45 AM
  • thanks for sharing..

  • robert on 6.15.2009 at 9:17 PM
  • great example script, thanks..

  • bodybuilding forum on 6.16.2009 at 3:18 PM
  • Great, thank you for sharing it.

  • Stop Dreaming Start Action on 6.21.2009 at 10:58 PM
  • This tutorial help us for fix our problem.

  • Rusli Zainal Sang Visioner on 7.08.2009 at 1:08 PM
  • Thank you very much for the information I really appreciate it!! a found this nice site.

  • Stop Dreaming Start Action on 7.08.2009 at 1:10 PM
  • hello, this is my first time i visit here. I found so many interesting in your blog especially its discussion. keep up the good work.

    Regard,

    Mr.Joko Tingkir, ST

Leave a Comment


Search this site

Last 3 Tweets

  • @joemorel So your 10 1/2. Got it.
  • @schambers I think 11. Let's not ask and offend him though, we will just count the candles on his power rangers cake.
  • @joemorel happy bday!!