Использование HTTP для взаимодействия с WSRF::Lite
Используйте curl для извлечения ResourcePropertyDocument
Установите WSRF::Lite (V0.8.2 или старше) и запустите контейнер WSRF::Lite, как описано в руководстве "Создание WS-Resources с использованием WSRF::Lite".
После начала работы контейнера создайте основанный на процессе WS-Resource-счетчик. Обратите внимание на то, что в более поздних версиях WSRF::Lite вся адресная информация содержится в wsa:Address URI EPR ресурса WS-Resource.
Передайте URI из элемента wsa:Address EPR нового WS-Resource-счетчика в curl или wget, как показано ниже.
Листинг 3. Извлечение ResourcePropertyDocument с помощью curl
bash$ curl http://192.168.1.3:50000/
WSRF/Counter/Counter/333811201107250088692
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Counter.xsl"?>
<wsrp:ResourceProperties xmlns:wsrp=\
"http://docs.oasis-open.org/wsrf/rp-2">
<mmk:bar xmlns:mmk="http://www.sve.man.ac.uk/Counter">
<BAR xmlns="http://docs.oasis-open.org/
wsrf/rp-2"><foo>mmmh</foo></BAR>
</mmk:bar>
<mmk:count xmlns:mmk="http://www.sve.man.ac.uk/Counter">0</mmk:count>
<wsrl:TerminationTime xmlns:wsrl="http://docs.oasis-open.org/wsrf/rl-2">
2007-02-20T12:38:33Z</wsrl:TerminationTime>
<wsrl:CurrentTime xmlns:wsrl="http://docs.oasis-open.org/wsrf/rl-2">
2007-02-20T11:38:42Z</wsrl:CurrentTime>
</wsrp:ResourceProperties>
|
В листинге 3 показан пример вывода, который вы увидите при использовании curl с wsa:Address URI WS-Resource-счетчика. Обратите внимание на то, что сообщение не содержит SOAP-элементов, а только ResourceProperties (если у вас не установлен Perl-модуль XML::CanonicalizeXML вместе с WSRF::Lite, вы увидите SOAP-элементы и не сможете использовать Ajax). WSRF::Lite удалил SOAP-элементы перед возвратом сообщения. Также обратите внимание на то, что XML содержит ссылку на таблицу стилей (stylesheet); в следующем разделе об XSLT будет показано, как используется эта таблица стилей.
Вы можете также обновить WS-Resource-счетчик, используя curl. Повторите предыдущую команду, но в этот раз перенаправьте вывод из curl в файл. Отредактируйте XML в файле для изменения значения mmk:count и используйте параметр -T программы curl для передачи файла назад в WS-Resource. С параметром -T
curl автоматически использует метод HTTP PUT для передачи содержимого файла по указанному URI. Можно также использовать параметр -v для получения более подробного вывода. В листинге 4 показан пример обновления WS-Resource с использованием HTTP PUT и curl. Значение счетчика изменилось на 5.
Листинг 4. Обновление WS-Resource с использованием curl и HTTP PUT
bash$ curl http://192.168.1.3:50000/WSRF/Counter/Counter/333811201107250088692 > \
/tmp/foobar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 625 100 625 0 0 1294 0 --:--:-- --:--:-- --:--:-- 0
bash$ vi /tmp/foobar
bash$ curl -T /tmp/foobar \
http://192.168.1.3:50000/WSRF/Counter/Counter/333811201107250088692
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Counter.xsl"?>
<wsrp:ResourceProperties xmlns:wsrp="http://docs.oasis-open.org/wsrf/rp-2">
<mmk:bar xmlns:mmk="http://www.sve.man.ac.uk/Counter">
<BAR xmlns="http://docs.oasis-open.org/wsrf/rp-2"><foo>mmmh</foo></BAR>
</mmk:bar><mmk:count xmlns:mmk="http://www.sve.man.ac.uk/Counter">5</mmk:count>
<wsrl:TerminationTime xmlns:wsrl="http://docs.oasis-open.org/wsrf/rl-2">
2007-02-20T12:38:33Z</wsrl:TerminationTime>
<wsrl:CurrentTime xmlns:wsrl="http://docs.oasis-open.org/wsrf/rl-2">
2007-02-20T12:14:19Z</wsrl:CurrentTime>
</wsrp:ResourceProperties>
|
Нет необходимости передавать полный ResourcePropertyDocument для обновления WS-Resource. Нужно только передать ResourceProperties, которые вы хотите изменить. Например, в листинге 5 в PUT-сообщение включено только новое значение счетчика. В данном примере используется параметр stdin
- с curl для ввода сообщения.
Листинг 5. Использование параметра stdin curl для обновления WS-Resource
bash$ echo '<?xml version="1.0" encoding="ISO-8859-1"?>\
<wsrp:ResourceProperties xmlns:wsrp="http://docs.oasis-open.org/wsrf/rp-2">\
<mmk:count xmlns:mmk="http://www.sve.man.ac.uk/Counter">5</mmk:count>\
</wsrp:ResourceProperties>' | \
curl -T - http://192.168.1.3:50000/WSRF/Counter/Counter/333811201107250088692
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Counter.xsl"?>
<wsrp:ResourceProperties xmlns:wsrp="http://docs.oasis-open.org/wsrf/rp-2">
<mmk:bar xmlns:mmk="http://www.sve.man.ac.uk/Counter">
<BAR xmlns="http://docs.oasis-open.org/wsrf/rp-2"><foo>mmmh</foo></BAR></mmk:bar>
<mmk:count xmlns:mmk="http://www.sve.man.ac.uk/Counter">5</mmk:count>
<wsrl:TerminationTime xmlns:wsrl="http://docs.oasis-open.org/wsrf/rl-2">
2007-02-21T12:39:19Z</wsrl:TerminationTime>
<wsrl:CurrentTime xmlns:wsrl="http://docs.oasis-open.org/wsrf/rl-2">
2007-02-21T12:06:53Z</wsrl:CurrentTime>
</wsrp:ResourceProperties>
|
Примечание: Нет необходимости включать полный ResourcePropertyDocument для обновления WS-Resource - нужны только ResourceProperties, которые вы хотите изменить.
В следующем разделе будет рассмотрено, как обеспечить поддержку для HTTP PUT, используя WSRF-операцию PutResourcePropertyDocument.
HTTP PUT и PutResourcePropertyDocument
В WSRF::Lite HTTP PUT отображается на PutResourcePropertyDocument. Однако WSRF::Lite не предоставляет встроенной операции PutResourcePropertyDocument; WS-Resource-разработчики должны предоставить реализацию. В листинге 6 показана реализация PutResourcePropertyDocument для WS-Resource-счетчика, находящаяся в файле $WSRF_MODULES/modules/WSRF/Counter/Counter.pm.
Листинг 6. Операция PutResourcePropertyDocument из примера WS-Resource-счетчика
#Мы позволяем операции PutResourcePropertyDocument устанавливать только
#TerminationTime и count
sub PutResourcePropertyDocument {
my $self = shift @_;
my $envelope = pop @_; #извлечь SOAP-конверт
#проверить, есть ли "count" в SOAP-конверте
if ( $envelope->match("//Body//count") )
{
#найден "count", обновить ResourceProperty после проверки его типа (должен быть int),
#предохраняемся от внедрения JavaScript-кода!
$WSRF::WSRP::ResourceProperties{count} = int( $envelope->valueof("//Body//count"));
}
#проверить наличие TerminationTime
if ( $envelope->match("//Body//{$WSRF::Constants::WSRL}TerminationTime") )
{
#найден TerminationTime, теперь попытаться использовать его для установки
#ResourceProperty, если TerminationTime в неправильном формате
#будет сгенерирована исключительная ситуация
eval {
#Использовать операцию WSRF SetTerminationTime с self,
#ожидается значение и конверт
$self->SetTerminationTime(
$envelope->valueof("//Body//{$WSRF::Constants::WSRL}TerminationTime"),
$envelope);
};
if ( $@ ) #плохой TerminationTime, перехват исключительной ситуации
{
print "Attempt to update TerminationTime with bad value\n $@";
}
}
#нужно возвратить новую версию ResourcePropertyDocument,
#вызвать WSRF-операцию GetResourcePropertyDocument с self.
return $self->GetResourcePropertyDocument($envelope);
}
|
Реализация PutResourcePropertyDocument для WS-Resource-счетчика позволяет изменять только TerminationTime и ResourceProperties count. Любые другие свойства ResourceProperties в сообщении игнорируются. Обратите внимание также на то, что операция ожидает SOAP-конверт. Контейнер WSRF::Lite преобразует сообщение HTTP PUT в SOAP-сообщение WSRF PutResourcePropertyDocument перед передачей его в WS-Resource и удаляет SOAP-элементы из ответа перед его возвратом клиенту.
Не забывайте проверять все вводимые значения на зловредность; например, злоумышленник может попытаться установить одно из свойств ResourceProperties в JavaScript-код, который он хотел бы выполнить в ничего не подозревающем Web-браузере пользователя. В случае с новым значением счетчика выполняется приведение его типа в int перед сохранением. TerminationTime проверяется в операции SetTerminationTime, для того чтобы убедиться в корректности форматирования строки времени. Если с форматом строки TerminationTime что-то не так, операция SetTerminationTime генерирует исключительную ситуацию - вот почему она вызывается в блоке eval.
|