Skip to main content

 

 

 

 

Template:OutSystems/Documentation_KB/Breadcrumb_New_Layout

 

 

Template:OutSystems/OSLanguageSwitcher

 

 

 

OutSystems

サポートされていないSOAPのユースケース

Service StudioにSOAP Webサービスをインポートすると、開発環境で識別された現在サポートされていない機能/ユースケースに関するフィードバックをただちに受信します。

この場合、すぐにWebサービスをService Studioにインポートすることはできません。ただし、場合によっては、識別された制限が適用されないように、サービスを記述するWSDLを少し変更し、OutSystemsでWebサービスを効果的に利用できます。

現在サポートされていない機能/ユースケースのリストは以下のとおりです。

Service StudioとOutSystemsプラットフォームは、サポートするSOAP 1.2の機能とユースケースを増やし、WSDLの調整が必要となるサポート対象外のシナリオを減らすために、継続的に改善されています。
このページを定期的に閲覧して、現在の制限に関する最新のリストを必ず確認してください。

以下のシナリオでは、現在サポートされていない一部の機能/ユースケースに対処できるように、WSDLに対して必要な変更を行うための一般的な手順を説明しています。

多次元配列

通常、OutSystemsではSOAP配列がサポートされますが、一部の多次元配列については現在サポートされていません。

例:

<xsd:complexType name="SummaryResultArray">
    <xsd:complexContent>
        <xsd:restriction base="soapenc:Array">
            <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:SummaryResult[][]"/>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="SummaryResultArray2">
    <xsd:complexContent>
        <xsd:restriction base="soapenc:Array">
            <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:SummaryResult[,]"/>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="SummaryResultArray3">
    <xsd:complexContent>
        <xsd:restriction base="soapenc:Array">
            <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:SummaryResult[10,2]"/>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>

ユースケースの回避策

現在、こうしたサポートされていないユースケースに対処するために利用できる一般的な回避策はありません。

実装なしの抽象型

WSDLまたはインクルードされたスキーマにある定義は、abstractとしてマークされる場合があります。つまり、この定義を実際に使用するには、派生(非抽象)型を使用する必要があります。派生された非抽象型が存在しない場合、その型は実際には使用できません。

以下の例では、AbstractContractがabstractとして宣言されています。これが要素の型として使用されているものの、そこから型が拡張されていない場合、エラーになります。

<xsd:complexType name="AbstractContract" abstract="true">
    <xsd:sequence>
        <xsd:element minOccurs="1" name="ContractNr" type="xsd:string" />
        <xsd:element minOccurs="1" name="StartDate" nillable="true" type="xsd:dateTime" />
        <xsd:element minOccurs="0" name="EndDate" nillable="true" type="xsd:dateTime" />
        <xsd:element minOccurs="2" maxOccurs="unbounded" name="Parties" type="tns:Party" />
    </xsd:sequence>
</xsd:complexType>

ユースケースの回避策

それぞれのシナリオに応じて、2つの回避策が考えられます。

  • 抽象型の要素(またはアトリビュート)を送信または受信する必要がある場合、型宣言からabstractの記述の削除を試みることができます。

  • 型を使用する予定がなく、使用する場合は必ずオプションとしてマークする(minOccurs="0"を使用するなど)場合、その型の使用方法および型自体をサービス定義から削除することができます。

再帰

再帰データ型は自らを参照するストラクチャです。再帰データ型の内部には、自身の型の別の要素への参照があります。

この参照は、直接的な参照または間接的な参照のいずれかです。たとえば、A型にはCを参照するB型のアトリビュートがあり、CにはA型の要素が含まれています。

以下に示す再帰の例を確認してください。

<xsd:complexType name="Person">
    <xsd:sequence>
        <xsd:element name="Firstname" type="xsd:string"/>
        <xsd:element name="Lastname" type="xsd:string"/>
        <xsd:element name="PhoneNumber" type="xsd:int"/>
        <xsd:element name="Address" type="s0:Address"/>
        <xsd:element name="Contacts" minOccurs="0" maxOccurs="unbounded" type="s0:Person">
    </xsd:sequence>
</xsd:complexType>

ユースケースの回避策

以下の一般的なガイドラインに従い、サポートされていないユースケースがプラットフォームで識別されないようにWSDLを適応させます。

  • 送信または受信する必要があるレベルまで再帰ストラクチャを「アンロール」する。
    上記の例に従って、2つのレベルの再帰を処理する場合には以下の処理を実行します。

    1. Person型に含まれるContacts型をs0:Person2型になるように変更します。
    2. Personの定義のコピーを作成し、それをPerson2に名前を変更します。
    3. Person2の定義からContacts要素を削除します。

単一のリストアトリビュートに含まれるリストアトリビュート

このユースケースが識別されるのは、maxOccursが1より大きい単一の要素を含むcomplexTypeがあり、その型が、maxOccursが1より大きい別の型の要素として使用される場合です。

例:

<xsd:complexType name="Organization">
    <xsd:sequence>
        <xsd:element name="Integration_ID" type="tns:External_Integration_ID" minOccurs="0" maxOccurs="unbounded" />
        <xsd:element minOccurs="0" maxOccurs="1" name="Name" type="xsd:string" />
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="External_Integration_ID">
    <xsd:sequence>
        <xsd:element name="ID" type="tns:IDType" maxOccurs="unbounded" />
    </xsd:sequence>
</xsd:complexType>

この例では、OrganizationIntegration_ID要素はサポートされていません。この要素にはExternal_Integration_ID型(maxOccursが1より大きい単一の要素で構成される)が含まれ、この要素自体がリストであるためです。

ユースケースの回避策

単一のリスト要素を含む型に任意のダミー要素(minOccurs="0")を追加します。

先ほどの例に従って、External_Integration_IDに属する<xsd:sequence>要素内に以下の要素を追加します。

<xsd:element name="dummy" type="xsd:string" minOccurs="0" />

ワイルドカード - Choice内の任意の要素

xsd:any構文を使用して、任意の要素を(オプションで特定の名前空間から)型に含めることができます。
この機能は通常はプラットフォームでサポートされますが、まだサポートされていない状況もあります。それはxsd:any要素がChoiceの定義内にある場合です。この場合、ストラクチャがインポートされません。

例:

<xsd:element name="RelatedPerson">
    <xsd:complexType>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="Employee" type="s0:Employee"/>
            <xsd:element name="Customer" type="s0:Customer"/>
            <xsd:any namespace="##other"/>
        </xsd:choice>
    </xsd:complexType>
</xsd:element>

ユースケースの回避策

現在、こうしたサポートされていないユースケースに対処するために利用できる一般的な回避策はありません。

WSDLを変更し、xsd:any要素をChoice定義の外に移動してオプションにする(つまり、minOccurs="0"アトリビュートを追加する)ことはできますが、取得される結果は元の定義と完全には一致しません。
また、この変更はリクエストに含まれる型に対してのみ行う必要があります。

ワイルドカード - 任意のアトリビュート

xsd:anyAttribute構文を使用して、任意のアトリビュートを、オプションで特定の名前空間から、型に含めることができます。

例:

<xsd:complexType name="LocationWithMetadata">
    <xsd:sequence>
        <xsd:element minOccurs="1" maxOccurs="1" name="name" type="xsd:string" />
        <xsd:element minOccurs="1" maxOccurs="1" name="coordinates" type="tns:CoordsGPS" />
    </xsd:sequence>
    <xsd:anyAttribute namespace="##targetNamespace"/>
</xsd:complexType>

ユースケースの回避策

xsd:anyAttributeを含む型がリクエストで送信されており、送信する必要があるアトリビュートを認識している場合、それでanyAttributeを置き換えることができます。
その他の場合、こうしたサポートされていないユースケースに対処するために利用できる一般的な回避策はありません。

任意の型 - AnyType

SOAPのサービス定義に含まれるすべての要素には型があります。一部の特殊なケースでは、その型がxsd:anyTypeである場合があります。これは特殊な型です。つまり、最も汎用的と考えられる型であり、この型から他のすべての型が派生します。これが要素に含まれる場合、その要素には考えられるあらゆる型が含まれる可能性があります。

例:

<xsd:complexType name="GenericInformation">
    <xsd:sequence>
        <xsd:element minOccurs="1" name="Name" type="xsd:string" />
        <xsd:element minOccurs="1" name="Type" type="tns:InformationKind" />
        <xsd:element minOccurs="1" name="IsActive" type="xsd:boolean" />
        <xsd:element name="SpecificInfo" type="xsd:anyType" />
    </xsd:sequence>
</xsd:complexType>

ユースケースの回避策

現在、こうしたサポートされていないユースケースに対処するために利用できる一般的な回避策はありません。

任意の型 - AnySimpleTypeおよびAnyAtomicType

xsd:anySimpleType型およびxsd:anyAtomicType型は、すべての単純型(複合型ではない)を表します。これらは、宣言でプレースホルダとして使用できます。特定の型の値は実行時に指定されます。

例:

<xsd:complexType name="ThirdParty">
    <xsd:attribute name="partyId" type="xsd:string" use="required"/>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="description" type="xsd:string"/>
    <xsd:attribute name="tags" type="xsd:anySimpleType"/>
    <xsd:attribute name="classifier" type="xsd:anyAtomicType"/>
</xsd:complexType>

注記:
xsd:anyAtomicType型には、他の型の結合(xsd:union)またはリスト(xsd:list)として定義される型は含まれません。
AnySimpleType型またはAnyAtomicType型は、WCFによって文字列としてマッピングされます。

ユースケースの回避策

上記の型の考えられるすべての値は、文字列として表すことができるため、要素の型をビルトインの文字列型に変更するという回避策が考えられます。

アトリビュートグループ

attributeGroup要素は、一連のアトリビュート宣言をグループ化し、複雑な型定義にグループとして組み込めるようにするために使用されます。

例:

 <xsd:complexType name="PersonInfo">
    <xsd:sequence>
        <xsd:element name="Forename" type="xsd:string"/>
        <xsd:element name="Surname" type="xsd:string"/>
        <xsd:element name="Dob" type="xsd:date"/>
   </xsd:sequence>
   <xsd:attributeGroup ref="ms:DateOfBirthGroup"/>
</xsd:complexType>

<xsd:attributeGroup name="DateOfBirthGroup">
    <xsd:attribute name="Day" type="xsd:string"/>
    <xsd:attribute name="Month" type="xsd:string"/>
    <xsd:attribute name="Year" type="xsd:integer"/>
</xsd:attributeGroup>

ユースケースの回避策

アトリビュートグループは複雑な型で参照できるアトリビュートのコンテナにすぎないため、アトリビュートグループのすべてのアトリビュートを、使用する複雑な型内に直接配置するという解決策が考えられます。

特殊文字を含むSOAPアクション名{ #special-characters }

現在、「-」などの特殊文字を含むWSDLで定義された一部の操作からはアクションを作成できません。

以下の例では、GetExtrasAndAdd-Ons操作はサポートされず、インポートされません。

<wsdl:portType name="AccountInformationSoap">
    <wsdl:operation name="GetExtrasAndAdd-Ons">
        <wsdl:input message="tns:MethodGetExtrasSoapIn"/>
        <wsdl:output message="tns:MethodGetExtrasSoapOut"/>
    </wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AccountInformationSoap" type="tns:AccountInformationSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="GetExtrasAndAdd-Ons">
        <soap:operation soapAction="http://example.com/AccountInformation/GetExtrasAndAddOns" style="document"/>
        <wsdl:input>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>

ユースケースの回避策

名前に特殊文字が含まれる操作については、回避策がありません。
WSDLから他の操作をインポートするには、WSDLをローカルに保存して編集し、この問題の原因となっている操作を削除します。

繰り返されるSOAPストラクチャのアトリビュート名{ #repeated-attribute-names }

SOAPストラクチャには、連続しない位置(リスト)であれば、名前が同じ1つの要素を複数含めることができます。ただし、これはまれなケースです。

以下の例では、AccountInformationType型にBranchIdという名前のアトリビュートが2つ含まれています。

<xsd:complexType name="AccountInformationType">
    <xsd:sequence>
        <xsd:element name="FirstName" type="xsd:string"/>
        <xsd:element name="LastName" type="xsd:string"/>
        <xsd:element name="BranchId" type="xsd:string"/>
        <xsd:element name="Email" type="xsd:string"/>
        <xsd:element name="Phone" type="xsd:string"/>
        <xsd:element name="BranchId" type="tns:BranchId"/>
    </xsd:sequence>
</xsd:complexType>

ユースケースの回避策

繰り返される名前の要素のいずれかのみを送信または受信するのみでよい場合、WSDLのローカルコピーで型定義を編集し、他の出現部分を削除します。

「<attrib>」および「<attrib>Field」という名前の同じSOAPストラクチャのアトリビュート

現在、「Field」というサフィックス(大文字と小文字が区別されます)を除き、同じ名前を持つ同じSOAPストラクチャに2つのアトリビュートを含めることはできません。

以下の例では、ExampleType型にorderという名前とorderFieldという名前の2つのアトリビュートが含まれています。

<xsd:complexType name="ExampleType">
    <xsd:sequence>
        <xsd:element name="order" type="xsd:string"/>
        <xsd:element name="orderField" type="xsd:string"/>
    </xsd:sequence>
</xsd:complexType>

ユースケースの回避策

WSDLのローカルコピーで型定義を編集し、<attrib>Fieldアトリビュートの名前を変更します。

  • Was this article helpful?