On 02/25/2012 05:12 PM, Chris Travers wrote:
> On Sat, Feb 25, 2012 at 1:30 PM, John Locke<m...@freelock.com>  wrote:
>
> <snip>
>> I'd say the main difference is taking the standard centralized stuff one
>> step further than you've outlined, doing the URL parsing and establishing
>> conventions before handing off to individual web service controllers.
>>
>> I've also found it useful to have separate request and response objects,
>> though at the moment I don't recall why. And of course have a different
>> class for each type of response and request -- XML, JSON, HTML, etc. -- that
>> implement standard methods that the framework can call regardless of type.
>
> Ok.  We'd need to map those out.  Any specific ideas?

$request -> method
$request -> headers (hash array)
$request -> data (hash array of body of request, deserialized from 
json/xml/form/etc -- unless there's some easy way to convert to a native 
LSMB data object, with data deserialized from request?)
$request -> raw  (unprocessed body of request)
$request -> path
$request -> params (hash array of GET parameter)
$request -> page (hash of start, count for index queries)

Generally would route the request to a controller class and method based 
either on GET params or on path/method (and usually a scheme for both, 
with one taking precedence). In the past I've used:

GET /(classname) ->  $class->index
GET /(classname)/(id)  -> $class->get(id)
PUT /(classname)/(id) -> $class->update(id)
POST /(classname) -> $class->create
DELETE /(classname)/(id) -> $class->delete(id)
POST /(classname)/(id)/(action) -> $class->callAction(action, id)
?view=(type)  -> override content-type header to designate response type
?action=(action) -> call specific method on a controller class 
(generally go through some standard action method first to apply access 
control)
?module=(class)


I've tended to create a base class for $response, and then extend that 
for each type. Then the controller can simply call a standard method on 
the object to deserialize as appropriate.

$response -> type (xml, json, html, etc)
$response -> data (hash array)
$response -> headers
$response -> status (e.g. 200 OK by default)
$response -> page (hash of start, count of results returned, 'match' 
total number of rows matching an index query)
$response -> error (if there's a problem, error message/code)

... something like that...

In most cases, the individual controllers would only set data and the 
page properties. For errors, I would generally just throw an exception 
and have the exception handler set the error object on the response. The 
individual response class should set headers/status as appropriate for 
the standard being implemented.


In one system I built, I used this same system for handling HTML pages 
as well as web services calls. This was using Smarty in PHP -- seems 
like Template Toolkit ought to work well for this as well... For that, I 
also had a $response->template where the controller could specify the 
HTML template to use, and methods for $response->assign, 
$response->assignSet to populate $response->data with variables as the 
page gets built... And then $response->render to serialize the output to 
the caller.

Cheers,
John Locke
http://freelock.com

------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Ledger-smb-devel mailing list
Ledger-smb-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ledger-smb-devel

Reply via email to