SOAP::Transport::HTTPモジュール (SOAP::Lite v.0.50)(日本語チョー訳)

by Hippo2000(2001/5/23)

SOAP::Transport::HTTPのPODなのです。

なおこのドキュメントはCPAN-Searchで出てきたドキュメント(PODを変換したもの)を日本語に訳そうとしたものです。わかりにくい部分は本物を見てください。(^^;;

原本の著作権はPaul Kulchenko さんがお持ちです。
Paul Kulchenko さんにはメールで了解をいただきました。

なお内容等が間違っていたら修正します。ご連絡ください。


目次


名前

SOAP::Transport::HTTP - SOAP::Liteのためのサーバ/クライアント側HTTPサポート


概要

クライアント
  use SOAP::Lite 
    uri => 'http://my.own.site.com/My/Examples',
    proxy => 'http://localhost/', 
  # proxy => 'http://localhost/cgi-bin/soap.cgi', # ローカルなCGIサーバー
  # proxy => 'http://localhost/',                 # ローカルなデーモン・サーバー
  # proxy => 'http://localhost/soap',             # ローカルな mod_perl サーバー
  # proxy => 'https://localhost/soap',            # ローカルな mod_perl セキュアサーバー
  # proxy => 'http://login:password@localhost/cgi-bin/soap.cgi', # ローカルな認証付のCGIサーバー
  ;

  print getStateName(1);


CGI server

  use SOAP::Transport::HTTP;

  SOAP::Transport::HTTP::CGI
    # My/Examples.pmへのパスをここで指定
    -> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method') 
    -> handle
  ;


Daemon server

  use SOAP::Transport::HTTP;

  # soapmark.plでテストしたければ、LocalPortを81に変更

  my $daemon = SOAP::Transport::HTTP::Daemon
    -> new (LocalAddr => 'localhost', LocalPort => 80)
    # specify list of objects-by-reference here 
    -> objects_by_reference(qw(My::PersistentIterator My::SessionIterator My::Chat))
    # specify path to My/Examples.pm here
    -> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method') 
  ;
  print "Contact to SOAP server at ", $daemon->url, "\n";
  $daemon->handle;


Apache mod_perl サーバー

詳細については examples/server/Apache.pm"例" セクションをご覧ください。
mod_soap server (.htaccess, directory-based access)
  SetHandler perl-script
  PerlHandler Apache::SOAP
  PerlSetVar dispatch_to "/Your/Path/To/Deployed/Modules, Module::Name, Module::method"
  PerlSetVar options "compress_threshold => 10000"

詳細については Apache::SOAP をご覧ください。

説明

このクラスはSOAPサーバーのための、それが置かれたWebサーバーがなんであるかから独立したすべてのHTTP関連のロジックをカプセル化します。もしこのクラスを使いたければ、上記の簡単なガイドラインに従わなければなりません。

以下のメソッドが利用できます:

on_action()
on_actionメソッドはSOAPActionの理解を指定させます。これは以下の3つのパラメータを取るサブルーチンへのリファレンスを受け取ります:
  SOAPAction, method_uri and method_name. 

SOAPAction はHTTPヘッダかた取得され、method_uri と method_name はリクエストの本体から取り出されます。デフォルトの動きは、もしあればSOAPActionにマッチし、なければ無視されます。例えば以下のようにしてSOAPActionがマッチしなければdieするといったように、独自のものを指定することができます:

  $server->on_action(sub {
    (my $action = shift) =~ s/^("?)(.+)\1$/$2/;
    die "SOAPAction shall match 'uri#method'\n" if $action ne join '#', @_;
  });

dispatch_to()
dispatch_toはどこにサービスをディパッチするかを指定させます。さらに正確にするため、PATH、MODULE、methodもしくはMODLE::methodの組み合わせを指定することができます。例えば:
  dispatch_to( 
    'PATH/',          # 動的: そこからすべてをロードします。すべてのモジュール、すべてのメソッド
    'MODULE',         # 静的: すべてのメソッドがこのモジュールから
    'MODULE::method', # 静的: 指定されたメソッドをこのモジュールから
    'method',         # 静的: 指定されたメソッドをmain::から
  );

もし指定するとパス(PATH)/モジュール名/クラスはパス・コンポーネントとしてuriから取得され、''/'を::'に置換されPerlモジュール名に変換されます。例えば:

  urn:My/Examples              => My::Examples
  urn://localhost/My/Examples  => My::Examples
  http://localhost/My/Examples => My::Examples

一貫性を保つため、パスの先頭の'/'は無視されます。

新しいクラスを展開するためのこのスキームにしたがって、指定されたディレクトリの1つのこのクラスを置かなければなりません。そしてそのサービスを楽しんでください。簡単でしょ?

handle()

handle メソッドはあなたのリクエストを取り扱います。request()でパラメータを提供し、handle()を呼び出し、response()でもどさなければなりません。
request()
request メソッドはServerコンポーネントへリクエスを取り扱うために提供することができるHTTP::Reuestオブジェクトへのアクセスを提供します。
response()
responseメソッドは、リクエストを取り扱った後、Serverコンポーネントからの結果を取得するためにアクセスすることができるHTTP::Response へのアクセスを提供します。
 

プロキシー設定

LWP::Agentモジュールで使うプロキシー設定のすべてを使うことができます:

 SOAP::Lite->proxy('http://endpoint.server/', 
                   proxy => ['http' => 'http://my.proxy.server']);

または

 $soap->transport->proxy('http' => 'http://my.proxy.server');

はプロキシー・サーバーを設定します。そしてプロキシー認証のためにHTTP_proxy_userとHTTP_proxy_passを使えば、SOAP::Liteはそれを適切に扱う方法をしっているはずです。

クッキーベースの認証

  use HTTP::Cookies;

  my $cookies = HTTP::Cookies->new(ignore_discard => 1);
    # セッションをまたがって保ちたければ'file'を追加することもできます。

  my $soap = SOAP::Lite->proxy('http://localhost/');
  $soap->transport->cookie_jar($cookies);

クッキーはレスポンスから取得され、リクエストに提供されます。HTTP::Cookieインターフェースで常に他のクッキーを追加(もしくはレスポンスの後に必要なことを取り出したり)することができます。

これを以下の1行ですることもできます:

  $soap->proxy('http://localhost/', 
               cookie_jar => HTTP::Cookies->new(ignore_discard => 1));

圧縮

SOAP::Liteは回線上(HTTP転送のみ)での圧縮を可能とするオプションを提供しています。サーバーとクライアントの双方でこの機能をサポートしていなければなりません、しかしロジックはアプリーケーションにとってまったく透過的です。もしクライアントがそれを受信することができ(クライアントは'deflate'または'*'の値でAccept-Encodingを送信します)、クライアントがフォールバック・ロジックを持っていれば、サーバーはエンコードされたメッセージだけで返答します。そのためサーバーが指定されたエンコーディング(Content-Encoding: deflate)を理解できず、適切なエラーコード(415 NOT ACCEPTABLE)を返せば、クライアントはエンコードされていない同じリクエストを繰り返し、このサーバーをセッションごとのキャッシュに格納します。そのためそこへの他のすべてのリクエストはエンコードなしにおこなわれます。

クライアント側とサーバー側で、圧縮のための閾値を設定させるオプションを有効すると、クライアントとサーバー側の両方で安全にこの機能を有効にすることができます。

クライアント
  print SOAP::Lite
    -> uri('http://localhost/My/Parameters')
    -> proxy('http://localhost/', options => {compress_threshold => 10000})
    -> echo(1 x 10000)
    -> result
  ;


サーバー

  my $server = SOAP::Transport::HTTP::CGI
    -> dispatch_to('My::Parameters')
    -> options({compress_threshold => 10000})
    -> handle;

 

圧縮はクライアント側で有効になります。もし:閾値が設定され、かつ現在のメッセージの大きさが閾値より大きく、かつモジュールCompress::Zlibが利用可能であれば。クライアントはもし閾値が指定され、かつompress::Zlibが利用可能であれば、値'deflate'を持ったヘッダ''Accept-Encoding' を送信します。

サーバーはCompress::Zlibが利用可能であれば、圧縮されたメッセージを受け取ります。そして以下の場合にのみ圧縮されたメッセージで応答します:閾値がしていされ、かつ現在のメッセージの大きさが閾値よりも大きく、かつモジュールCompress::Zlibが利用可能で、リクエストにヘッダ'Accept-Encoding'があれば。


SOAPサーバーの以下の例について考えてみてください:

CGI:
  use SOAP::Transport::HTTP;

  SOAP::Transport::HTTP::CGI
    -> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method') 
    -> handle
  ;


デーモン:

  use SOAP::Transport::HTTP;

  my $daemon = SOAP::Transport::HTTP::Daemon
    -> new (LocalAddr => 'localhost', LocalPort => 80)
    -> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method') 
  ;
  print "Contact to SOAP server at ", $daemon->url, "\n";
  $daemon->handle;


mod_perl:

httpd.conf:
  <Location /soap>
    SetHandler perl-script
    PerlHandler SOAP::Apache
  </Location>

Apache.pm:

  package SOAP::Apache;

  use SOAP::Transport::HTTP;

  my $server = SOAP::Transport::HTTP::Apache
    -> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method'); 

  sub handler { $server->handler(@_) }

  1;

Apache::Registry:
httpd.conf:
  Alias /mod_perl/ "/Apache/mod_perl/"
  <Location /mod_perl>
    SetHandler perl-script
    PerlHandler Apache::Registry
    PerlSendHeader On
    Options +ExecCGI
  </Location>

soap.mod_cgi (put it in /Apache/mod_perl/ directory mentioned above)

  use SOAP::Transport::HTTP;

  SOAP::Transport::HTTP::CGI
    -> dispatch_to('/Your/Path/To/Deployed/Modules', 'Module::Name', 'Module::method') 
    -> handle
  ;

警告: Apache::Registryでの動的な展開はは失敗します。というのも動的にロードされるのは最初のときだけだからです。その後、それはメモリ上にあります。それは動的な展開を迂回し、アクセスが拒否されたことについてのエラーを生成します。dispatch_to()でPATH/とMODULE名の両方を指定してください。するとモジュールは動的にロードされ、静的な展開と同じように機能します。例としてexamples/server/soap.mod_cgiをご覧ください。


トラブル・シューティング

動的なライブラリが見つからない(Dynamic libraries are not found)
もしWebサーバーのログファイルに以下のようなものを見つけた場合:

Can't load '/usr/local/lib/perl5/site_perl/.../XML/Parser/Expat/Expat.so' for module XML::Parser::Expat: dynamic linker: /usr/local/bin/perl: libexpat.so.0 is NEEDED, but object does not exist at /usr/local/lib/perl5/.../DynaLoader.pm line 200.

そしてApacheウェブ・サーバーを使っていれば、httpd.confに以下のものを追加してみてください。

 <IfModule mod_env.c>
     PassEnv LD_LIBRARY_PATH
 </IfModule>

Apacheがセグメント・フォルトでコケる
SOAP::Lite(もしくはXML::Parser::Expat)をmod_perlと組み合わせて使っていて、httpdでランダムにセルグメント・フォルトが発生するのであれば、Apacheを以下のように設定してみてください:
 RULE_EXPAT=no

詳細についてはhttp://archive.covalent.net/modperl/2000/04/0185.xml をご覧になってください。この通信上の動きについて説明してくれたRobert Barta (rho@bigpond.net.au) にとても感謝します。

CGI スクリプトがMicrosoft Internet Information Server(IIS)で動かない

拡張子が.cgiではなく.plでなければ、IISの下でCGI スクリプトは動かないかもしれません。

依存性

 Crypt::SSLeay             HTTPS/SSLのため
 SOAP::Lite, URI           SOAP::Transport::HTTP::Serverのため
 LWP::UserAgent, URI       SOAP::Transport::HTTP::Clientのため
 HTTP::Daemon              SOAP::Transport::HTTP::Daemonのため
 Apache, Apache::Constants SOAP::Transport::HTTP::Apacheのため


参考資料

 実装の詳細については ::CGI, ::Daemon and ::Apache をご覧ください。
 SOAP::Transport::HTTP::CGI 例は examples/server/soap.cgi をご覧ください。
 SOAP::Transport::HTTP::Daemon の例は examples/server/soap.daemon をご覧ください。
 SOAP::Transport::HTTP::Apache の例は examples/My/Apache.pm をご覧ください。


著作権(COPYRIGHT)

(原文のまま)

Copyright (C) 2000-2001 Paul Kulchenko. All rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


作者(AUTHOR)

(原文のまま)

Paul Kulchenko (paulclinger@yahoo.com)


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。