gsoapテストプログラム

40718 ワード


私のテスト環境はUbuntu 12です。04、windowsの下で基本的に同じです。


1.wsdlファイルの準備


次は私がテストしたwsdl定義ファイルで、公式のSampleから変更されたaddメソッドを定義しています.
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="first"
 targetNamespace="http://localhost/wsdl/first.wsdl"
 xmlns:tns="http://localhost/wsdl/first.wsdl"
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:ns="urn:first"
 xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:MIME="http://schemas.xmlsoap.org/wsdl/mime/"
 xmlns:DIME="http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/"
 xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
 xmlns="http://schemas.xmlsoap.org/wsdl/">

 <types>

    <schema targetNamespace="urn:first"
     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
     xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:ns="urn:first"
     xmlns="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="unqualified"
     attributeFormDefault="unqualified">
      <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
    </schema>

 </types>

  <message name="addRequest">
    <part name="a" type="xsd:double"/>
    <part name="b" type="xsd:double"/>
  </message>

  <message name="addResponse">
    <part name="result" type="xsd:double"/>
  </message>

  <portType name="firstPortType">
    <operation name="add">
      <documentation>Service definition of function ns__add</documentation>
      <input message="tns:addRequest"/>
      <output message="tns:addResponse"/>
    </operation>
  </portType>

  <binding name="first" type="tns:firstPortType">
    <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="add">
      <SOAP:operation style="rpc" soapAction=""/>
      <input>
        <SOAP:body use="encoded" namespace="urn:first" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <SOAP:body use="encoded" namespace="urn:first" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
  </binding>

  <service name="first">
    <documentation>my first service definition</documentation>
    <port name="first" binding="tns:first">
      <SOAP:address location="http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"/>
    </port>
  </service>

</definitions>

2.firstを生成する.h


コマンドラインwsdl 2 h-s-o first.h first.wsdl
-sオプション、STLを使用しないことを指定します.
これによりfirstが生成される.hヘッダファイル、このファイルにはaddという方法が宣言されていますが、名前が少し違います.
int ns2__add(      double                              a, ///< Request parameter      double                              b, ///< Request parameter      double                             &result ///< Response parameter );

3.実装コードの生成


コマンドラインsoapcpp 2-i first.h
必要なのはC++のソースファイルなので、オプション-iを使用して、純粋なCソースファイルを生成し、オプション-cを使用します.

4.サーバ側実装の作成


ソースファイルfirstServer.cpp
#include "soapfirstService.h"
#include "first.nsmap"

int main(int argc, char **argv)
{ 
    firstService first;
    if (argc < 2)
        first.serve();    /* serve as CGI application */
    else
    {
        int port = atoi(argv[1]);
        if (!port)
        { 
            fprintf(stderr, "Usage: calcserver++ <port>
"
); exit(0); } /* run iterative server on port until fatal error */ if (first.run(port)) { first.soap_stream_fault(std::cerr); exit(-1); } } return 0; } int firstService::add(double a, double b, double& result) { result = a + b; return SOAP_OK; }

5.クライアント実装の記述


ソースファイルfirstClient.cpp
#include "soapfirstProxy.h"
#include "first.nsmap"

const char server[] = "localhost:2000";

int main(int argc, char **argv)
{ 
    if (argc < 4)
    { 
        fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num
"
); exit(0); } double a, b, result; a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); firstProxy first; first.soap_endpoint = server; switch (*argv[1]) { case 'a': first.add(a, b, result); break; default: fprintf(stderr, "Unknown command
"
); exit(0); } if (first.error) first.soap_stream_fault(std::cerr); else printf("result = %g
"
, result); return 0; }

6.コンパイル


gsoap-xxx/gsoapディレクトリのstdsoap 2.hとstdsoap 2.cppは現在のディレクトリにコピーされます.
コンパイルサーバー:
g++ -o firstServer firstClient.cpp stdsoap2.cpp soapC.cpp soapfirstService.cpp -lgsoap++
クライアントのコンパイル:
g++ -o firstClient firstClient.cpp stdsoap2.cpp soapC.cpp soapfirstProxy.cpp -lgsoap++


7.テスト


サービス側には2つの動作方式があり、1つはcgiとして実行され、httpサーバのサポートが必要である.もう1つは、個別のサーバ側として動作します.最初の方法なら上のfirstClient.cppはserverを修正し、あなたのcgiリンクを指す必要があります.2つ目は、コマンドラインで直接実行します./firstServer 2000、パラメータはポートで、2000を例に挙げます.
クライアントテストを実行するには、次の手順に従います.
./firstClient add 1 1 result = 2
結果を見て、仕事を終えた.