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