Fase 1) E’ necessario avere una bella web app da far girare ad amici e parenti.
Fase 2) Per qualche ragione non la si vuole tenere online permanentemente.
Fase 3) Si usa wget per crearne una copia locale da mettere su CD o passare via FTP.

$ wget -nH -r -k -E http://localhost:3000/
-nH
non genera la dir del dominio sul filesystem
-r
ricorsivo nelle subdir
-E
aggiunge l’estensione ad un url senza formato ma con content-type “text/html”
-k
a download completato, riscrive i link in modo che i file siano raggiungibili in locale (se sono stati scaricati)

Segue zip e distribuzione. ;-)

Mentre la bufera di neve torna ad affliggere Bologna, io giochicchio con Mojolicious e mi segno un paio di note.

Per provare a scimmiottare un’interfaccia REST seria, m’ero costruito a colpi di given un controller che generava la risposta in funzione dell’attributo format dello stash (solite cose: html, json, xml); per altro, poichè non stavo usando “the right way” mi stavo pure scontrando con alcune difficoltà implementative (1).

In realtà esiste un comodissimo metodo respond_to che già compie questa selezione internamente (il codice).

Dato questo codice:

#!/usr/bin/env perl
use Mojolicious::Lite;
get ‘/test’ => sub {
        my $self = shift;
        my $data = { a => 1, b => 2, c => 3 };
        $self->respond_to(
                json => { json => $data },
                html => { text => $self->dumper($data) }
        );
};
app->start;

possiamo ottenere diverse risposte:

(1) sim@titanio:/tmp$ mojo get -v -H ‘Accept: text/html’ ‘http://localhost:3001/test’
GET /test HTTP/1.1
User-Agent: Mojolicious (Perl)
Accept: text/html
Content-Length: 0
Host: localhost:3001

HTTP/1.1 200 OK
X-Powered-By: Mojolicious (Perl)
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Date: Sat, 04 Feb 2012 15:33:23 GMT
Server: Mojolicious (Perl)
Content-Length: 39

{
  ‘c’ => 3,
  ‘a’ => 1,
  ‘b’ => 2
}
—————————–
(2) sim@titanio:/tmp$ mojo get -v -H ‘Accept: application/json’ ‘http://localhost:3001/test’
GET /test HTTP/1.1
User-Agent: Mojolicious (Perl)
Accept: application/json
Content-Length: 0
Host: localhost:3001

HTTP/1.1 200 OK
X-Powered-By: Mojolicious (Perl)
Content-Type: application/json
Connection: keep-alive
Date: Sat, 04 Feb 2012 15:34:01 GMT
Server: Mojolicious (Perl)
Content-Length: 19

{"c":3,"a":1,"b":2}
—————————
(3) sim@titanio:/tmp$ mojo get -v -H ‘Accept: text/plain’ ‘http://localhost:3001/test’GET /test HTTP/1.1
User-Agent: Mojolicious (Perl)
Accept: text/plain
Content-Length: 0
Host: localhost:3001

HTTP/1.1 204 No Content
X-Powered-By: Mojolicious (Perl)
Connection: keep-alive
Date: Sat, 04 Feb 2012 15:34:40 GMT
Server: Mojolicious (Perl)
Content-Length: 0
————————–
(4) sim@titanio:/tmp$ mojo get -v -H ‘Accept: text/plainz’ ‘http://localhost:3001/test’
GET /test HTTP/1.1
User-Agent: Mojolicious (Perl)
Accept: text/plainz
Content-Length: 0
Host: localhost:3001

HTTP/1.1 200 OK
X-Powered-By: Mojolicious (Perl)
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Date: Sat, 04 Feb 2012 15:35:15 GMT
Server: Mojolicious (Perl)
Content-Length: 39

{
  ‘c’ => 3,
  ‘a’ => 1,
  ‘b’ => 2
}

Le prime tre sono corrette, poichè dati determinati header ottengo le risposte giuste:

  1. text/html – 200
  2. application/json – 200
  3. text/plain – 204 – nessuna rappresentazione corretta

Il quarto a mio avviso è un fail, o meglio una scelta discutibile: invece che riconoscere l’header sbagliato e mandare a spendere il client con un 204, gli serviamo html.

Benchè alla fine di quel metodo venga restituito un 204 se il $target non esite (#L423), il gioco “sporco” accade 20 righe prima dove nel caso la rappresentazione passata non venga individuata, si ricade nella situazione di default (html di solito). Il problema a questo punto si incrocia con la possibilità che Mojolicious non abbia dentro di se la rappresentazione corretta benchè sia comune (openoffice, pdf – che forse ora sono stati inseriti, non so), cosa che può portare a conclusioni di default anche quando la rappresentazione richiesta è corretta ma non presente nei tipi di Mojo. In ogni caso, si può sempre aggiungere qualcosa ai MIME.

Ho comunque poi scoperto che la cosa è stata discussa in passato ed è stato deciso così.
Well, basta saperlo. :)

PS: Io avrei lasciato i client mal fatti nel loro brodo, ma tant’è – probabilmente non capisco bene le implicazioni.

Note:
(1) Le rotte in Mojolicious permettono di selezionare il formato utilizzando un array reference

get ‘/formats’ => [format => [‘html’,‘xml’]] => sub { };
sim@titanio:/tmp$ perl myapp.pl routes -v
/formats  GET  formats  ^/formats\.(xml|html)$

ma, come si vede dalla regex, questo fa sì che la rotta “pulita” diventi “/formats.” che non è proprio quello che si vuole, di solito.

    
SIMOTRONE WEB PAGE is based on WordPress platform, RSS tech , RSS comments design by Gx3.