Это краткое руководство, которое поможет вам начать работу. Я собираюсь использовать CGI, а не FastCGI, но это действительно одно и то же. Просто представьте, что цикл находится вокруг выбора параметра.
Простой CGI
Начнем с простой программы CGI. Я буду использовать cgi_this
, чтобы запустить его из-за отсутствия реального веб-сервера.
#!/usr/bin/env perl
use strict;
use warnings;
use CGI;
my $q = CGI->new;
my $name = $q->param('name');
print $q->header;
if ($name) {
print <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
print <<"HTML";
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}
1;
Это hello.pl . Нужен исполняемый флаг.
Запуск программы
Вы начинаете с cgi_this
следующим образом.
$ ls
hello.pl
$ cgi_this
Exporting '.', available at:
http://127.0.0.1:3000/
Found the following scripts:
http://127.0.0.1:3000/hello.pl
Теперь вы можете открыть его в браузере.
Если вы введете имя и отправите форму, появится приветствие.
Преобразование в PSGI
Все это просто. Теперь давайте преобразуем его.
Начнем с нового файла с именем hello.psgi . На самом деле не имеет значения, если он называется .psgi , но это соглашение.
Мы должны сделать пару шагов, чтобы заставить его работать с протоколом PSGI. Мы будем использовать Plack :: Request , чтобы помочь нам сделать это.
Вся программа должна быть заключена в вызов my $app = sub { ... };
.
#!/usr/bin/env plackup
use strict;
use warnings;
use Plack::Request;
my $app = sub {
my $env = shift; # this is the Plack environment
my $req = Plack::Request->new($env);
my $q = CGI->new;
my $name = $q->param('name');
print $q->header;
if ($name) {
print <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
print <<"HTML";
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}
};
# no 1; here, we want it to return $app;
Теперь, очевидно, мы не загрузили CGI, и в любом случае нет среды CGI. Итак, затем нам нужно получить параметр. Избавьтесь от бита $q
и используйте вместо него $req
.
my $name = $req->parameters->{name};
Теперь запустите это с plackup
, затем запросите его на http://localhost:5000.
$ plackup hello.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
Response should be array ref or code ref: 1 at ...
BANG! Это не удается, потому что мы еще не закончили. Как видите, он записал HTML-код в STDOUT, но это не пошло в браузер. Это потому, что PSGI передает ссылки, а ваша программа не общается напрямую с STDOUT или STDERR.
Он также жалуется на отсутствующую ссылку. Давайте разберемся с этим в первую очередь. В конце ссылки на код добавьте это:
# prepare the response
my $res = $req->new_response(200);
$res->content_type('text/html');
return $res->finalize;
Мы просим наш Plack :: Request создать для нас новый Plack :: Response, установить тип контента и вернуть завершенный (думаю immutable ) ответ обработчику Plack, который будет сериализовать и отправлять в браузер как фактический ответ HTTP.
Теперь замените все операторы print
. Создайте новую переменную $content
и вместо print
ing output соедините ее с этой переменной. Затем передайте это ответу.
my $content;
if ($name) {
$content .= <<"HTML";
<html><body><h1>Hello, $name</hi></body></html>
HTML
}
else {
$content .= <<"HTML";
<html><body><form method="GET">
<label>What's your name? <input type="text" name="name"></label>
</form></body></html>
HTML
}
# prepare the response
my $res = $req->new_response(200);
$res->content_type('text/html');
$res->body($content);
Теперь перезапустите ваше приложение в терминале и снова получите к нему доступ. Это будет выглядеть так же, как CGI.