gSOAP 2.8.8 を使用して Web サービスを開発しています。カスタム データ型の無制限のシーケンスを送信したいと考えています。これは、gSOAP のユーザー ガイドのセクション 11.11に従って次のように実装できます。
class ns__InnerType {
std::string someStr;
int someInt;
};
class VectorOfInnerTypes {
ns__InnerType* __ptr;
int __size;
};
void ns__myMethod(VectorOfInnerTypes in, ns__EmptyResponse out);
これはうまくいきます。ただし、私のプログラムは C++ であるため、STL ベクトルを利用したいと考えています。私が読んだすべてのことから、gSOAP はベクトルのシリアル化をサポートしているようです。これが私がうまくいくと信じているものです:
#import "stlvector.h"
class VectorOfInnerTypes {
std::vector<ns__InnerType> mylist;
};
soapcpp2 はこれを喜んでコンパイルし、スタブの を呼び出すときに C++ ベクトルを渡すことができmyMethod
ます。ただし、ネットワークを介して行われるのは次のとおりです。
<s:Envelope ...>
<s:Body s:EncodingStyle=...>
<q1:myMethod xmlns:q1="urn:ns"/>
</s:Body>
</s:Envelope>
__ptr
これを/を使用したときのネットワーク トラフィックと比較します__size
。
<SOAP-ENV:Envelope ...>
<SOAP-ENV:Body ...>
<ns:myMethod>
<mylist xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="ns:InnerType[3]">
<item>...</item>
<item>...</item>
<item>...</item>
</mylist>
</ns:myMethod>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
仕事に取りかかるためstd::vector
に、次のさまざまな組み合わせを試しました。
std::vector<ns__InnerType> mylist;
std::vector<ns__InnerType*> mylist;
std::vector<ns__InnerType>* mylist;
std::vector<ns__InnerType*>* mylist;
必要条件soap_new_std__vectorTemplate...
とsoap_new_ns__InnerType
クライアントでデータを準備するとき、しかし改善はありません。正しくシリアル化することを拒否します。
機能する場合 ( __ptr
/ __size
) と機能しない場合 ( std::vector
) の両方で、 の呼び出しmyMethod
はコード 202 または HTTP Accepted を返します。
私、および C++ プログラムで gSOAP を使用するすべての人が、プリミティブ__ptr
/__size
ウェイの代わりに STL ベクトルを使用するにはどうすればよいですか? どんな助けでも大歓迎です。