インターネットをかける泡

GoogleAmazonでもうすっかりおなじみの WebAPI、別名 SOAP、日本語で訳すと泡が最近インターネットで大人気です。PerlSOAPを使うなら以下のサイトは必見です。

http://guide.soaplite.com/

上記の記述を元にHelloモジュールを世界に公開しちゃいましょう。

/home/fuga/test/hello.cgi

SOAP::Transport::HTTP::CGI は自作モジュールを世界に公開します(この場合Helloモジュール)。モジュールの実装を別ファイルで行う場合は、use strict; のあとに use ???; を追加します。

#!/usr/bin/perl -w

use strict;
use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI
	-> dispatch_to('Hello')
	-> handle;

package Hello;

sub hi {
	return "こんにちわ、世界";
}

sub bye {
	return "さようなら、世界";
}

sub languages {
	return ("パール", "C言語", "シェル");
}

/home/fuga/test/hello_test.cgi

uri のところは便宜上つけた URL とさきほどのモジュール名を書きます。proxy には実際の CGI がある場所を指定します。

#!/usr/bin/perl -w

use strict;
use SOAP::Lite;

my $client = SOAP::Lite
	->uri('http://soap.hogehoge.co.jp/Hello')
	->proxy('http://dev.hogehoge.co.jp/~fuga/test/hello.cgi');
my $result1 = $client->hi()->result();
my $result2 = $client->bye()->result();
my @rarray1 = $client->languages()->paramsout;
my $result3 = $client->languages()->result;

print "Content-Type: text/plain; charset=euc-jp\n\n";
print "$result1\n$result2\n";
print "結果は「$result3」、その他のパラメータは「@rarray1」\n";

/home/fuga/test/hello_test2.cgi

WSDLファイルを外部に公開する場合はこちらを使います。別途WSDLファイルを用意しなければいけません。

#!/usr/bin/perl -w

use strict;
use SOAP::Lite;

my $client = SOAP::Lite->service("http://soap.hogehoge.co.jp/~fuga/test/Hello.wsdl");
my $result1 = $client->hi();
my $result2 = $client->bye();
my @result3 = $client->languages();

print "Content-Type: text/plain; charset=euc-jp\n\n";
print "$result1\n$result2\n";
print "結果は「@result3」\n";

/home/fuga/test/Hello.wsdl

メソッドを3つ持ったモジュールの定義です。こんなの手書きでなんてやってられません・・。

<wsdl:definitions name="Hello" targetNamespace="http://soap.hogehoge.co.jp/Hello" xmlns:tns="http://soap.hogehoge.co.jp/Hello" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">

  <wsdl:types/>

  <!-- definition about input -->
  <wsdl:message name="HelloIF_hiRequest">
  </wsdl:message>

  <!-- definition about output -->
  <wsdl:message name="HelloIF_hiResponse">
    <wsdl:part name="result" type="xsd:string" />
  </wsdl:message>

  <!-- definition about module -->
  <wsdl:portType name="HelloIF">
    <wsdl:operation name="hi" parameterOrder="">
      <wsdl:input message="tns:HelloIF_hiRequest" />
      <wsdl:output message="tns:HelloIF_hiResponse" />
    </wsdl:operation>

    <wsdl:operation name="bye" parameterOrder="">
      <wsdl:input message="tns:HelloIF_hiRequest" />
      <wsdl:output message="tns:HelloIF_hiResponse" />
    </wsdl:operation>

    <wsdl:operation name="languages" parameterOrder="">
      <input message="tns:HelloIF_hiRequest" />
      <wsdl:output message="tns:HelloIF_hiResponse" />
    </wsdl:operation>
  </wsdl:portType>

  <!-- definition about method -->
  <wsdl:binding name="HelloIFBinding" type="tns:HelloIF">
    <wsdl:operation name="hi">
      <wsdl:input>
        <soap:body
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        use="encoded" namespace="http://soap.hogehoge.co.jp/Hello" />
      </wsdl:input>

      <wsdl:output>
        <soap:body
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        use="encoded" namespace="http://soap.hogehoge.co.jp/Hello" />
      </wsdl:output>

      <soap:operation soapAction="" />
    </wsdl:operation>

    <wsdl:operation name="bye">
      <wsdl:input>
        <soap:body
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        use="encoded" namespace="http://soap.hogehoge.co.jp/Hello" />
      </wsdl:input>

      <wsdl:output>
        <soap:body
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        use="encoded" namespace="http://soap.hogehoge.co.jp/Hello" />
      </wsdl:output>

      <soap:operation soapAction="" />
    </wsdl:operation>

    <wsdl:operation name="languages">
      <wsdl:input>
        <soap:body
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        use="encoded" namespace="http://soap.hogehoge.co.jp/Hello" />
      </wsdl:input>

      <wsdl:output>
        <soap:body
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        use="encoded" namespace="http://soap.hogehoge.co.jp/Hello" />
      </wsdl:output>

      <soap:operation soapAction="" />
    </wsdl:operation>

    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
    style="rpc" />
  </wsdl:binding>

  <!-- definition about cgi location -->
  <wsdl:service name="Hello">
    <wsdl:port name="HelloIFPort" binding="tns:HelloIFBinding">
      <soap:address
      location="http://dev.hogehoge.co.jp/~fuga/test/hello.cgi" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

実行してみる

hi(), bye(), languages() の結果がインターネットを越えてやってきました。結果を eval してやってごにょごにょすれば柔軟なことができるでしょう。

$ ./hello_test.cgi
Content-Type: text/plain; charset=euc-jp

こんにちわ、世界
さようなら、世界
結果は「パール」、その他のパラメータは「C言語 シェル」