[Catalyst] General API question: REST + SOAP

2011-04-06 Thread Bill Moseley
I'm wondering if anyone has provided both a REST-like API and a SOAP API to
their application and can provide some feedback from their experience.

I have an existing set of controllers that initially handled AJAX requests.
 The controllers use a common base class that provides REST-like actions.
 By creating a controller subclass, say App::Controller::Foo, I get actions
GET, POST, PUT, DELETE for /foo.  The base class knows how to work with DBIC
for the Foo Result class and also by default looks for a form
App::Form::Foo.  Kind of an auto-crud setup.   What data (mostly columns) is
returned for GET is defined by configuration.  The code that ends up in the
Foo controller is mostly access control (often by adding to the DBIC
resultset) the base class builds.

What eventually ends up happening is search, create, update, and delete get
called on a resultset.

These controllers essentially provide a useful API into the application as
well as supporting AJAX requests.  I now need to add a SOAP API that will
provided the same functionality as the existing REST-like API.

I'm using Catalyst::Controller::SOAP and that gives me a Perl data structure
that represents the SOAP payload.  Since I already have the REST actions I'm
wondering if it makes sense to simply flatten the SOAP request and
re-dispatch to the REST actions and make use of the existing logic in these
controllers.

Is anyone doing something like this?  That is, remapping a SOAP request to
REST actions?  Would I be better off writing a separate set of
self-contained SOAP controllers?

Also, does anyone have a suggestion how to version an API?  That is, say I
have an API method POST /foo to create a new Foo object.  Would it be better
to use something like POST /api/rest/version_2/foo?

-- 
Bill Moseley
mose...@hank.org
___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] General API question: REST + SOAP

2011-04-06 Thread Peter Edwards
On 6 April 2011 14:59, Bill Moseley mose...@hank.org wrote:

 I'm wondering if anyone has provided both a REST-like API and a SOAP API to
 their application and can provide some feedback from their experience.


Hi Bill, we had to do the reverse of that (for a Perl app that wasn't using
Catalyst) and added a REST API on to a SOAP one.
I think a direct mapping of SOAP actions - REST methods is your safest bet
for keeping it intelligible and maintainable.
SOAP is a four letter word, of course :-]


 Also, does anyone have a suggestion how to version an API?  That is, say I
 have an API method POST /foo to create a new Foo object.  Would it be better
 to use something like POST /api/rest/version_2/foo?


Yes I've used the /api/v1/foo  /api/v2/foo approach before and it works well
and makes it easy to separate out old APIs for regression testing when you
add new stuff.

Regards, Peter
___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] General API question: REST + SOAP

2011-04-06 Thread Trevor Leffler

Peter Edwards wrote:


On 6 April 2011 14:59, Bill Moseley mose...@hank.org 
mailto:mose...@hank.org wrote:


Also, does anyone have a suggestion how to version an API?  That is,
say I have an API method POST /foo to create a new Foo object.
 Would it be better to use something like POST /api/rest/version_2/foo?


Yes I've used the /api/v1/foo  /api/v2/foo approach before and it works 
well and makes it easy to separate out old APIs for regression testing 
when you add new stuff.


 Regards, Peter

Hi, I've also seen the use of HTTP request headers for specifying 
service API minor versions (and other bits).  In particular, EBay comes 
to mind; they use v1, v2 in the end-point plus an 
X-EBAY-SOA-SERVICE-VERSION header.


http://developer.ebay.com/DevZone/finding/Concepts/MakingACall.html#callstruct

--Trevor


___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] General API question: REST + SOAP

2011-04-06 Thread Bill Moseley
On Wed, Apr 6, 2011 at 9:44 AM, Trevor Leffler tleff...@uw.edu wrote:


 Hi, I've also seen the use of HTTP request headers for specifying service
 API minor versions (and other bits).  In particular, EBay comes to mind;
 they use v1, v2 in the end-point plus an X-EBAY-SOA-SERVICE-VERSION header.


I thought about doing that.  Not sure where I'd hook in to the Catalyst
request -- I guess before prepare_action modify the path to insert the
version so that the correct version of controllers are used.

That approach might also make it easier to fall back -- if no v2 controller
exists then fallback to a previous version.   That way only need to create
new controllers for the methods that actually changed.   Hopefully, we are
not making new versions very often.



On a side note, we came across this issue with Firefox and X- headers over
the last few weeks:

 https://bugzilla.mozilla.org/show_bug.cgi?id=646378

A customer was complaining of seemingly random failures and by logging
request headers we could see that the requests that failed were missing all
the X- headers. And for these requests the X- headers was necessary.  (The
load balancer was depending on the header to route the request to the
correct web server.)


-- 
Bill Moseley
mose...@hank.org
___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


[Catalyst] Re: General API question: REST + SOAP

2011-04-06 Thread Aristotle Pagaltzis
* Trevor Leffler tleff...@uw.edu [2011-04-06 18:50]:
 Hi, I've also seen the use of HTTP request headers for
 specifying service API minor versions (and other bits).  In
 particular, EBay comes to mind; they use v1, v2 in the
 end-point plus an X-EBAY-SOA-SERVICE-VERSION header.

 http://developer.ebay.com/DevZone/finding/Concepts/MakingACall.html#callstruct

This is a very bad idea. No matter what problem you have,
a custom HTTP header is very nearly certainly the wrong solution.
For API versioning it definitely is.

Putting the version in the URI is the right approach – if in fact
you even need an explicit version. (You can always switch to
a different URI space no matter whether you made a provision for
it using a version number in the URI or not.)

Of course eBay didn’t have a lot of options, being that their API
is SOAP-centric (even though they now support non-SOAP options).
So don’t make their mistake: don’t use SOAP. If you inescapably
have to support it as an option, then at least don’t design your
API from its point of view.

Regards,
-- 
Aristotle Pagaltzis // http://plasmasturm.org/

___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] Re: General API question: REST + SOAP

2011-04-06 Thread Dave Rolsky

On Thu, 7 Apr 2011, Aristotle Pagaltzis wrote:


This is a very bad idea. No matter what problem you have,
a custom HTTP header is very nearly certainly the wrong solution.
For API versioning it definitely is.


My understanding of REST, at least, is that versioning should be done by 
specifying different Accept and Content-Type headers, like 
x-application/x-myapp-auction-item-v1.


This makes sense with REST, since the URI for a thing should always stay 
the same, but it's representation can vary. The API version is part of 
that representation.



-dave

/*
http://VegGuide.org   http://blog.urth.org
Your guide to all that's veg  House Absolute(ly Pointless)
*/

___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


[Catalyst] Re: General API question: REST + SOAP

2011-04-06 Thread Aristotle Pagaltzis
* Dave Rolsky auta...@urth.org [2011-04-07 05:25]:
 On Thu, 7 Apr 2011, Aristotle Pagaltzis wrote:
 This is a very bad idea. No matter what problem you have,
 a custom HTTP header is very nearly certainly the wrong
 solution. For API versioning it definitely is.

 My understanding of REST, at least, is that versioning should
 be done by specifying different Accept and Content-Type
 headers, like x-application/x-myapp-auction-item-v1.

 This makes sense with REST, since the URI for a thing should
 always stay the same, but it's representation can vary. The API
 version is part of that representation.

There isn’t any requirement in REST that a resource have only one
URI. There is much less so any requirement that a resource be the
equivalent of a platonic idea. In fact, if you try to treat them
that way, you cause yourself problems that REST is meant to
eliminate – it increases the coupling of client and server that
REST aims to loosen.

Switching media types is not a bad idea, much better than using
a header anyway. But you want to be very careful about just when
you make a change as disruptive as that, as well you don’t want
to use too application-specific media types, because doing so
very nearly eliminates the opportunity to bind services together
in unforeplanned ways (“serendipity”, in Roy’s words, “mash-ups”
if you are Web 2.0 hipster, “synergy” if you are the CTO, or just
plain “integration” if you’re the one getting work done :-) ).

Regards,
-- 
Aristotle Pagaltzis // http://plasmasturm.org/

___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/