If you need SSL, for example, you'll need to put Apache or Nginx in front of Starman. Traditional web servers still have a place in the NWO.
Brett On Tue, Oct 29, 2013 at 10:30 AM, Mark Allen <[email protected]> wrote: > No need for CGI or Apache or anything else in the pipeline. > > starman your_dancer_app.pl > > https://metacpan.org/pod/Starman > > Most people front the Starman instance(s) with nginx to load balance, > reverse proxy, terminate SSL and accept requests off port 80 or 443. Many > use Server::Starter as Brett suggests below, too. > > I echo the suggestion to use REST semantics for any API because that > decouples your clients from any particular implementation of an RPC > protocol. You can use curl as a client if you want in a REST environment. > I personally see that as a feature. > > > > On Tuesday, October 29, 2013 9:00 AM, B. Estrade <[email protected]> > wrote: > On Mon, Oct 28, 2013 at 5:12 PM, Michael R. Davis <[email protected]>wrote: > > > > I need to set up JSON web services (server side) as a simple interface > to an existing database infrastructure. Can anyone recommend any building > blocks, standards, etc.? > > > From: Mark Allen <[email protected]> > > Sent: Saturday, October 26, 2013 12:13 AM > > http://advent.perldancer.org/2010/8-Writing REST web services with > Dancer > > > So, I just wanted to follow up on my progress and research. It was a bit > frustrating! > > Even though REST is not a requirement, I looked into Dancer and it was > okay but boy was it a lot of research to just get it to work under Apache > CGI with Plack::Runner. I also DO NOT like that it's function based. To > get there I had to write a session object which returns a lazy > loading DBIx::Array database handle . But, overall I did like the > dispatching (except I kept forgetting the sub is an anonymous sub to > the function "get" so the "get" function needs a semicolon at the end of > the anonymous sub block). > > Next I'm going to look a the JSON RPC packages on CPAN. I've attached my > code here as it really is throwaway at this time. I hope someone else can > learn from it. > > > > If you are going to run Dancer, I'd suggest nginx. Apache is fine, but if > you're passing the request off, it's better to have a lighter weight httpd > (that also supports SSL) in front of it. For the PSGI server, I'd look at > Starman (coupled potentially with Server::Starter for initialization). And > it's really not unlike CGI::Application, just PSGI compliant and built for > persistence. > > If you are not bound to a persistent process, then CGI::Application + > CGI::Application::Dispatch is really nice. There are also tons of plugins, > including Sessions and Authentication. > > I do like Dancer, but am not as familiar with it as CGI::Application. > Whatever you use, however, I would recommend committing to "REST" rather > than RPC. > > At the end of the day, your API will be much cleaner and you'll end up > writing a lot less code on the backend to handle the requests. I would > also consider a PSGI compliant framework since it really opens up your > hosting and testing options. > > Brett > > > > --- > My Dancer CGI app,,, > > $ cat dancer.cgi > #!/usr/bin/env perl > use Plack::Runner; > Plack::Runner->run('/var/www/cgi-bin/dancer.pl'); > > > $ cat dancer.pl > #/usr/bin/perl > use strict; > use warnings; > use Dancer; > > set 'logger' => 'console'; > set 'show_errors' => 1; > set 'warnings' => 1; > > our $session; #cannot set session here at compile time > > sub session { #set session at run time > return $session||=STOP::Session->new(%{params()}); > } > > get '/' => sub { > content_type 'text/html'; > return '<p>Hello World!<p>'; > }; > > get '/env' => sub { > content_type 'text/plain'; > return join "\n", map {sprintf "%s => %s", $_ => $ENV{$_}} sort keys > %ENV; > }; > > get '/die' => sub { > die("Error: die\n"); > }; > > prefix '/:database/:dag'; > > #content_type 'application/json'; > content_type 'text/plain'; > > get '/params' => sub { > content_type 'text/plain'; > return join "\n", map {sprintf "%s => %s", $_ => param($_)} sort keys > %{params()}; > }; > > get '/device/:id' => sub { > return to_json { > device => scalar({}), > id => param("id"), > schematxt => &session->schematxt, > date => &session->sdb->sqlscalar("SELECT SYSDATE FROM > DUAL"), > }; > }; > > get '/devices' => sub { > return to_json { > devices => > scalar(&session->sdb->sqlarrayhash(&devices_sql(&session->schematxt), > &session->userid)), > }; > }; > > dance; > > > > --- > > mrdvt92 > > _______________________________________________ > Houston mailing list > [email protected] > http://mail.pm.org/mailman/listinfo/houston > Website: http://houston.pm.org/ > > > > _______________________________________________ > Houston mailing list > [email protected] > http://mail.pm.org/mailman/listinfo/houston > Website: http://houston.pm.org/ > > > _______________________________________________ > Houston mailing list > [email protected] > http://mail.pm.org/mailman/listinfo/houston > Website: http://houston.pm.org/ >
_______________________________________________ Houston mailing list [email protected] http://mail.pm.org/mailman/listinfo/houston Website: http://houston.pm.org/
