2009-05-25 2 views
14

Я пытаюсь написать скрипт CGI Perl для обработки запросов XML-RPC, в которых XML-документ отправляется как тело HTTP-запроса POST.Как я могу получить весь объект запроса с CGI.pm?

Модуль CGI.pm отлично справляется с извлечением именованных параметров из HTTP-запроса, но я не могу понять, как заставить его дать мне весь объект HTTP-запроса (то есть XML-документ в XML-RPC запрос, который я обрабатываю).

Если нет CGI.pm, есть ли еще один модуль, который сможет разобрать эту информацию из запроса? Я бы предпочел не извлекать эту информацию «вручную» из переменных окружения. Спасибо за любую помощь.

ответ

24

Вы можете получить необработанные данные POST с помощью специального имени параметра POSTDATA.

my $q = CGI->new; 
my $xml = $q->param('POSTDATA'); 

В качестве альтернативы, вы можете прочитать STDIN непосредственно вместо того, чтобы использовать CGI.pm, но тогда вы потеряете все другие полезные вещи, которые CGI.pm делает.

Уловка POSTDATA задокументирована в превосходных документах CGI.pm here.

+0

Спасибо! К сожалению, я пропустил это в документах. –

12

Правильно, можно использовать POSTDATA, но это работает только в том случае, если в запросе Content-Type не установлено значение «multipart/form-data».

Если установлено значение «multipart/form-data», CGI.pm не выполняет инициализацию собственной обработки содержимого и POSTDATA.

Таким образом, другие варианты включают $cgi->query_string и/или $cgi->Dump.

$cgi->query_string возвращает содержимое POST в формате GET (param=value&...), и, похоже, нет способа просто получить содержимое POST STDIN, поскольку они были переданы клиентом.

Для получения фактического содержимого стандартного ввода запроса POST, если вы изменяете CGI.pm, вы можете изменить строку 620, чтобы сохранить содержимое @lines где-то в переменной, например:

$self->{standard_input} = join '', @lines; 

И затем получить к нему доступ через $cgi->{standard_input}.

Смежные вопросы