0

で困っていsudsます。

API を呼び出すための汎用システムを作成しようとしています。いくつかのパラメーターは、複数の属性を持つクラスとして定義されています。最初はこれらの属性はすべて空で、辞書を渡して属性の一部を自動的に入力しようとしています

例えば:

from suds.client import Client

client = Client("...")
method = "getCampaignsByCriteria"
arg_repr = {"ids": [123]}
arg = client.factory.create("CampaignSearchCriteria")
for k, v in arg_repr.iteritems():
    setattr(arg, k, v)
service = client.service
args_map = {"searchCriteria": arg}
getattr(service, method)(**args_map)

CampaignSearchCriteriaそこからのすべてのデフォルトフィールドを使用して、次を生成し、ids正しく設定します。

<SOAP-ENV:Body>
  <ns1:getCampaignsByCriteria>
     <searchCriteria xsi:type="ns1:CampaignSearchCriteria">
        <ids xsi:type="ns1:ArrayOf_xsd_long">123</ids>
        <searchString xsi:type="ns0:string"/>
        <pageNumber xsi:type="ns2:int"/>
        <pageSize xsi:type="ns2:int"/>
        <advertiserIds xsi:type="ns1:ArrayOf_xsd_long"/>
        <archiveFilter xsi:type="ns1:ActiveFilter">
           <activeOnly xsi:type="ns2:boolean"/>
           <inactiveOnly xsi:type="ns2:boolean"/>
        </archiveFilter>
        <sortOrder xsi:type="ns1:SortOrder">
           <descending xsi:type="ns2:boolean"/>
           <fieldName xsi:type="ns0:string"/>
        </sortOrder>
     </searchCriteria>
  </ns1:getCampaignsByCriteria>
</SOAP-ENV:Body>

ただし、私はidsフィールドを設定しているだけなので、SOAP 本体が次のように空でないフィールドを考慮に入れるようにしたいと思います。

<SOAP-ENV:Body>
  <ns1:getCampaignsByCriteria>
     <searchCriteria xsi:type="ns1:CampaignSearchCriteria">
        <ids xsi:type="ns1:ArrayOf_xsd_long">123</ids>
     </searchCriteria>
  </ns1:getCampaignsByCriteria>
</SOAP-ENV:Body>

メソッドにカスタム引数を使用しているときに、含めるフィールドを選択する方法が見つかりませんでした。何かご意見は?

4

1 に答える 1

0

SOAP リクエストがどのように表示されるかは、WSDL、特にメッセージのスキーマを指定するデータ型定義によって異なります。
そのため、一部のフィールドを省略したり、スキーマで許可されていない場合、メッセージが有効なリクエストでなくなったりすることはありません。

私が正しければ、これは私たちが話している wsdl である必要があります。すべての属性minOccursが存在しないためです。つまり、デフォルトは 1 であり、nillable であっても要素を省略することはできません。

私の一般的なアドバイス: SOAP リクエストがどのように見えるかについてあまり考えないでください。SOAP は xml であるため、人間が読めるようになっていますが、実際には人間が解釈できるようには設計されていません。

于 2012-05-07T17:24:35.123 に答える