[Dancer-users] one route, different actions based on context

Naveed Massjouni naveedm9 at gmail.com
Sat Dec 25 05:30:02 CET 2010


On Fri, Dec 24, 2010 at 6:02 PM, Puneet Kishor <punk.kish at gmail.com> wrote:
>
>
> Alastair Sherringham wrote:
>>
>> On 24 December 2010 19:48, Puneet Kishor<punk.kish at gmail.com>  wrote:
>>>>
>>>> $ curl http://application/foo/all
>>>>
>>>> a json stream of all the foo widgets is returned.
>>
>> There's an advent calendar up just now with some advice on this sort
>> of thing e.g.
>>
>> Writing REST web services with Dancer
>> http://advent.perldancer.org/2010/8
>>
>> Some curl usage - maybe use "application/json"? e.g.
>>
>> curl -H 'Accept-Type: application/json'<url>
>
>
> Thanks. A great article, helps clear the fog further.
>
> Nevertheless, my problem now is as I articulated in my last email. What I
> want is to send back the template only if being request via a browser as a
> regular, non-Ajax request  (how should I determine that?). Otherwise, if it
> is being called via Ajax or from the command line via curl or lwp or
> whatever, a json stream should be returned. So, given (pseudocode ahead) --
>
>  1 prepare_serializer_for_format;
>  2
>  3 get '/all.:format' => sub {
>  4
>  5      my $res = query->db->for->all;
>  6
>  7      # Requested a full web page from the browser, so
>  8      # use the template; no need to use a serializer
>  9      if (request->came_from_browser_non_ajax) {
> 10              template 'all.tt', {res => $res, other => $options};
> 11      }
> 12
> 13      # For ajax requests or requests from command line,
> 14      # use the requested serializer and return a text
> 15      # stream
> 16      else {
> 17              return to_json $res;
> 18      }
> 19
> 20 };
>
> The idea is that a user can go to http://server/foo/all and see the entire
> web page as rendered by the template 'all.tt', or the user can request a
> specific serialized format via the command line and get a text stream back.
> Would be nice to have a default serialization format defined, so, for
> example, if no specific format is requested then JSON can be sent back,
> else, XML or whatever can be sent back.

I haven't tested this, but I think this is all you need:

prepare_serializer_for_format;
get '/all' { template 'all' };
get '/all.:format' => sub { return { foo => 'bar' } };

In your javascript ajax call, you would explicitly request /all.json.
Same with curl:
    curl http://localhost:3000/all.json

-Naveed

>
>
>
>>
>> Cheers,
>>
>>
>
>
>
> --
> Puneet Kishor
> _______________________________________________
> Dancer-users mailing list
> Dancer-users at perldancer.org
> http://www.backup-manager.org/cgi-bin/listinfo/dancer-users
>


More information about the Dancer-users mailing list