3

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 ベクトルを利用したいと考えています。私が読んだすべてのことから、g​​SOAP はベクトルのシリアル化をサポートしているようです。これが私がうまくいくと信じているものです:

#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 ベクトルを使用するにはどうすればよいですか? どんな助けでも大歓迎です。

4

0 に答える 0