Non-Ruby REST client for Ruby REST server

Hi,

I have a Rails 2 app and I wand to provide an API for 3rd party
applications written on any language the customer uses.

My thoughts are that the best way of providing it is by taking
advantage of rails RESTfulness and let them perform CRUD actions on my
data through it. But I don't seem to find many information on how to
achieve this.

I first want to develop .NET clients (or web service consumers)
because must of our customers use .NET. I did some prototypes and
could retrieve XML data, but I don't seem to find a way of doing
inserts, updates and deletes.
What I get is a 422 http error from the rails server and I assume has
something to do with the Header.

Where can I find more information about this. More specificlly about
what the server is expecting to receive in the header and the message.

Also, if someone has experience on WCF and can point me out where to
find more valuable info it will be appreciated.

Java examples will work as well.

Thanks,

Roberto

Hi,

I have a Rails 2 app and I wand to provide an API for 3rd party
applications written on any language the customer uses.

My thoughts are that the best way of providing it is by taking
advantage of rails RESTfulness and let them perform CRUD actions on my
data through it. But I don't seem to find many information on how to
achieve this.

Definitely. Your controller can provide an out-of-the-box API by
examining the HTTP accept header and returning XML. Rails wraps this
up for you automatically if you use the respond_to method in your
controller:

def index
  @things = Thing.find(:all)
  respond_to do |format|
    format.html # render template
    format.xml { render :xml => @things.to_xml }
  end
end

This example is a bit simplistic but demonstrates the principle of how
you can return XML instead of HTML based on the http header.

I first want to develop .NET clients (or web service consumers)
because must of our customers use .NET. I did some prototypes and
could retrieve XML data, but I don't seem to find a way of doing
inserts, updates and deletes.
What I get is a 422 http error from the rails server and I assume has
something to do with the Header.
Where can I find more information about this. More specificlly about
what the server is expecting to receive in the header and the message.

Make sure you're setting the accept and content-type headers correctly
to "text/xml" or "application/xml". That's the clue Rails needs to
trigger the right action in your respond_to block. We actually have a
chapter on doing this exact thing in our upcoming book, Rails for .NET
Developers (http://pragprog.com/titles/cerailn).

Also, if someone has experience on WCF and can point me out where to
find more valuable info it will be appreciated.

Java examples will work as well.

You may find our upcoming class helpful, as we touch on RESTful web
service creation in Rails: http://www.purpleworkshops.com/workshops/rest-and-web-services
(you can use discount code "PWRRGG" for 10% off).

Hope this helps a bit?

Jeff

Jeff,

I think I didn’t explain myself correctly or was at some point misleading.
I do have the service up and running and working with XML already.

From C# code I can do all the GET methods and get the XML responses, for example:

Now I know creating or updating isn’t as simple as retrieving (which was pretty easy). As a start I’ll read the following which I think will be useful:
http://blogs.vertigo.com/personal/petar/Blog/archive/2008/06/23/twitter-wcf-client.aspx

I also found an open source WPF project that may help me as a guide:
http://sourceforge.net/projects/twitterful/

Will your chapter cover this subject? What will the integrating with .NET cover? Looking forward to see your book and also coperate with what myself and my team achieve.

Thank you!

Roberto

If you haven't already, have a look at the client section of this article here:

http://msdn.microsoft.com/en-us/magazine/cc748663.aspx

If I skim that correctly :wink: it sounds like the ado.net data services client library speaks REST...

Sounds to me like you aren't setting the HTTP Method on your client
side update/insert/delete requests.

For example in curl you would do this with -X => curl -X delete
http://server/resource/2 to delete resource 2

Sounds to me like you are sending GET requests to an action that
expects something different

Say you want to delete a resource 4 on localhost The header should
resemble roughly something like this.

delte / HTTP/1.1
User-Agent: curl/7.19.0 (i386-apple-darwin9.4.0) libcurl/7.19.0 zlib/1.2.3
Host: localhost
Accept: */*

I'm not sure about how you want to write the client but you can also
include a request param "_method" and give it the corresponding HTTP
method. (PUT, POST, DELTE etc.)

I found out that what was not letting me do the POST/PUT's is:

"protect_from_forgery"

because of the authenticity token needed.

Now I need to know if there's a workaround for this without having to
stop using this method.

Thanks!

fervic wrote:

I found out that what was not letting me do the POST/PUT's is:

"protect_from_forgery"

because of the authenticity token needed.

Now I need to know if there's a workaround for this without having to
stop using this method.

Thanks!

Hi,

I came across this problem and the solution is quite simple. Bumping
this topic for other poor googling souls.

Just put skip_before_filter :verify_authenticity_token in your
controller.

See the docs for ActionController::RequestForgeryProtection for more
info; you could also override that method instead if you wanted to do
something specific for non-verified clients.

James

So does that leave the forgery protection in place for browser clients?

Thanks!

-Roy