この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

SOAP サービス: WSDL ドキュメントからのクラスの定義

クラスは、ローカルハードドライブまたはネットワークに保管されている WSDL ドキュメントから自動的に生成できます。WSDL ドキュメントを使ってクラスを作成すると、開発者は Apex コードの中で外部 Web サービスへのコールアウトすることができます。

可能な場合には、送信メッセージを使用して、インテグレーションソリューションを処理します。必要な場合に限り、サードパーティの Web サービスの呼び出しを使用します。

メモ

WSDL から Apex クラスを作成する手順は、次のとおりです。

  1. アプリケーションで、[設定] から、[クイック検索] ボックスに「Apex クラス」と入力し、[Apex クラス] を選択します。
  2. [WSDL からの生成] をクリックします。
  3. [参照] をクリックして、ローカルハードドライブまたはネットワーク上の WSDL ドキュメントを選択するか、フルパスを入力します。この WSDL ドキュメントが、作成する Apex クラスの基礎となります。

    指定した WSDL ドキュメントに、送信ポートを参照する SOAP エンドポイントの場所が記載されている場合があります。

    セキュリティ上の理由から、Salesforce では、指定できる送信ポートを、次のいずれかに制限します。

    • 80: このポートは、HTTP 接続のみを受け付けます。
    • 443: このポートは、HTTPS 接続のみを受け付けます。
    • 1024 ~ 66535 (1024 と 66535 も含む): これらのポートは、HTTP 接続または HTTPS 接続を受け付けます。

    メモ

  4. [WSDL を解析] をクリックして、WSDL ドキュメントの内容を確認します。アプリケーションが、WSDL ドキュメント内の各名前空間のデフォルトクラス名を生成し、エラーがあれば報告します。WSDL に Apex クラスがサポートしていないスキーマ種別または構造が含まれている場合や、結果生成されるクラス名が 100 万文字という Apex クラスの制限を超える場合は、解析に失敗します。たとえば、Salesforce SOAP API WSDL は解析できません。
  5. 必要に応じて、そのクラス名を変更します。それぞれの名前空間に対して同じクラス名を使用することにより、1 つのクラスに複数の WSDL 名前空間を保存できますが、Apex クラスは、合計 100 万文字以内にしてください。
  6. [Apex の生成] をクリックします。ウィザードの最終ページには、正常に生成されたクラスと、その他のクラスのエラーが表示されます。また、正常に生成されたコードを表示するためのリンクも示されます。

正常に生成された Apex クラスには、WSDL ドキュメントで示されるサードパーティ Web サービスをコールするスタブと種別クラスが含まれています。これらのクラスにより、Apex から外部の Web サービスを呼び出すことができます。生成されたクラスごとに、同じ名前で Async というプレフィックスが付いた 2 つ目のクラスが作成されます。1 つ目のクラスは、同期コールアウトに使用されます。2 つ目のクラスは、非同期コールアウトに使用されます。非同期コールアウトについての詳細は、「Visualforce ページでの長時間コールアウトの実行」を参照してください。

生成された Apex に関して次の点に注意してください。

  • WSDL ドキュメントに Apex の予約語が含まれている場合は、Apex クラスが生成されるときに、その語の後ろに「_x」が付きます。たとえば、WSDL ドキュメントに「limit」があると、生成される Apex クラスでは「limit_x」になります。「予約キーワード」を参照してください。Apex 変数名でサポートされていない WSDL の要素名の文字の処理の詳細については、「WSDL 使用についての考慮事項」を参照してください。
  • WSDL の操作に複数の要素を含む出力メッセージがある場合、生成された Apex は内部クラスの要素をラップします。WSDL の操作を示す Apex メソッドは、各要素ではなく内部クラスを返します。
  • Apex クラス名にピリオド (.) は使用できないため、Apex クラスの生成に使用される WSDL 名に含まれるすべてのピリオドは、生成される Apex コードではアンダースコア (_) で置き換えられます。

WSDL からクラスを生成した後、WSDL で参照される外部サービスを呼び出すことができます。

このトピックの残りの部分にあるサンプルを使用する前に、「生成される WSDL2Apex コード」にある Apex クラス docSampleClass をコピーして組織に追加する必要があります。

メモ

外部サービスの呼び出し

WSDL ドキュメントを使用して Apex クラスを生成した後、外部サービスを呼び出すには、Apex コードにスタブのインスタンスを作成して、そこでメソッドをコールします。たとえば、Apex から StrikeIron IP アドレス検索サービスを呼び出すために、次のようなコードを作成できます。

1  // Create the stub
2  strikeironIplookup.DNSSoap dns = new strikeironIplookup.DNSSoap();
3
4  // Set up the license header
5  dns.LicenseInfo = new strikeiron.LicenseInfo();
6  dns.LicenseInfo.RegisteredUser = new strikeiron.RegisteredUser();
7  dns.LicenseInfo.RegisteredUser.UserID = 'you@company.com';
8  dns.LicenseInfo.RegisteredUser.Password = 'your-password';
9
10  // Make the Web service call
11  strikeironIplookup.DNSInfo info = dns.DNSLookup('www.myname.com');

HTTP ヘッダーのサポート

Web サービスコールアウトに HTTP ヘッダーを設定できます。たとえば、この機能を使用して認証ヘッダーに Cookie の値を設定できます。HTTP ヘッダーを設定するには、inputHttpHeaders_x および outputHttpHeaders_x をスタブに追加します。

API バージョン 16.0 以前では、コールアウトの HTTP 応答は、コンテンツタイプのヘッダーに関係なく UTF-8 を使用して復号化されます。API バージョン 17.0 以降では、HTTP 応答はコンテンツタイプのヘッダーで指定された符号化方式を使用して復号化されます。

メモ

次のサンプルでは、「生成される WSDL2Apex コード」のサンプル WSDL ファイルを使用しています。

Web サービスコールアウトでの HTTP ヘッダーの送信

1docSample.DocSamplePort stub = new docSample.DocSamplePort();
2stub.inputHttpHeaders_x = new Map<String, String>();
3
4//Setting a basic authentication header
5
6stub.inputHttpHeaders_x.put('Authorization', 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==');
7
8//Setting a cookie header
9stub.inputHttpHeaders_x.put('Cookie', 'name=value');
10
11//Setting a custom HTTP header
12stub.inputHttpHeaders_x.put('myHeader', 'myValue');
13
14String input = 'This is the input string';
15String output = stub.EchoString(input);

inputHttpHeaders_x の値を指定すると、標準ヘッダーセットがその値で上書きされます。

Web サービスコールアウト応答からの HTTP 応答ヘッダーへのアクセス

1docSample.DocSamplePort stub = new docSample.DocSamplePort();
2stub.outputHttpHeaders_x = new Map<String, String>();
3String input = 'This is the input string';
4String output = stub.EchoString(input);
5
6//Getting cookie header
7String cookie = stub.outputHttpHeaders_x.get('Set-Cookie');
8
9//Getting custom header
10String myHeader = stub.outputHttpHeaders_x.get('My-Header');

outputHttpHeaders_x のデフォルト値は null です。応答のヘッダーの内容にアクセスするには、outputHttpHeaders_x を設定する必要があります。

サポートされる WSDL の機能

Apex では、ドキュメントリテラルでラップした WSDL スタイルと次のプリミティブデータ型と組み込みデータ型のみをサポートしています。

スキーマの型 Apex の型
xsd:anyURI String
xsd:boolean Boolean
xsd:date Date
xsd:dateTime Datetime
xsd:double Double
xsd:float Double
xsd:int Integer
xsd:integer Integer
xsd:language String
xsd:long Long
xsd:Name String
xsd:NCName String
xsd:nonNegativeInteger Integer
xsd:NMTOKEN String
xsd:NMTOKENS String
xsd:normalizedString String
xsd:NOTATION String
xsd:positiveInteger Integer
xsd:QName String
xsd:short Integer
xsd:string String
xsd:time Datetime
xsd:token String
xsd:unsignedInt Integer
xsd:unsignedLong Long
xsd:unsignedShort Integer

Salesforce データ型 anyType は、API バージョン 15.0 以降を使用して保存される Apex コードを生成するときに使用する WSDL ではサポートされません。API バージョン 14.0 以前を使用して保存されるコードでは、anyType は string に対応付けされます。

メモ

Apex では、次のスキーマ構造をサポートしています。

  • xsd:all、API バージョン 15.0 以降を使用して保存した Apex コードにおいて
  • xsd:annotation、API バージョン 15.0 以降を使用して保存した Apex コードにおいて
  • xsd:attribute、API バージョン 15.0 以降を使用して保存した Apex コードにおいて
  • xsd:choice、API バージョン 15.0 以降を使用して保存した Apex コードにおいて
  • xsd:element。API バージョン 15.0 以降を使用して保存した Apex コードにおいて、ref 属性が次の制限付きでサポートされます。
    • 他の名前空間の ref はコールできません。
    • グローバル要素では ref を使用できません。
    • また、要素に ref が含まれる場合も、name または type を含めることができません。
  • xsd:sequence

次のデータ型は、コールインとして使用されている場合、つまり外部 Web サービスが Apex Web サービスメソッドをコールする場合にのみサポートされています。これらのデータ型は、コールアウトとして使用されている場合、つまり Apex Web サービスメソッドが外部 Web サービスをコールする場合はサポートされていません。

  • blob
  • decimal
  • enum

Apex は次のようなその他の WSDL コンストラクタ、データ型、サービスをサポートしていません。

  • RPC/符号化サービス
  • 複数の portTypes、複数のサービス、または複数のバインドを含む WSDL サービス
  • 外部スキーマをインポートする WSDL ファイル。たとえば、外部スキーマをインポートしている次の WSDL フラグメントは、サポートされていません。
    1<wsdl:types>
    2    <xsd:schema
    3     elementFormDefault="qualified"
    4     targetNamespace="http://s3.amazonaws.com/doc/2006-03-01/">
    5      <xsd:include schemaLocation="AmazonS3.xsd"/>
    6    </xsd:schema>
    7  </wsdl:types>

    ただし、同じスキーマ内のインポートはサポートされています。次の例では、外部 WSDL は変換する WSDL に貼り付けられます。

    1<wsdl:types>
    2    <xsd:schema
    3      xmlns:tns="http://s3.amazonaws.com/doc/2006-03-01/"
    4      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    5      elementFormDefault="qualified"
    6      targetNamespace="http://s3.amazonaws.com/doc/2006-03-01/">
    7
    8      <xsd:element name="CreateBucket">
    9        <xsd:complexType>
    10          <xsd:sequence>
    11     [...]
    12    </xsd:schema>
    13  </wsdl:types>
  • 前の表に記載されていないスキーマの型
  • Salesforce WSDL を含めた、サイズ制限を超えた WSDL
  • ドキュメントリテラルでラップしたスタイルを使用しない WSDL。次の WSDL スニペットはドキュメントリテラルでラップしたスタイルを使用しないため、インポートしたときに「Unable to find complexType (complexType が見つかりません)」というエラーが発生します。
    1<wsdl:types>
    2    <xsd:schema targetNamespace="http://test.org/AccountPollInterface/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3      <xsd:element name="SFDCPollAccountsResponse" type="tns:SFDCPollResponse"/>
    4      <xsd:simpleType name="SFDCPollResponse">
    5          <xsd:restriction base="xsd:string" />
    6      </xsd:simpleType>
    7    </xsd:schema>
    8  </wsdl:types>
    次のスニペットは、要素の順序を含む complexType として simpleType 要素をラップするよう変更したものです。この場合はドキュメントリテラルのスタイルに従っているため、サポートされています。
    1<wsdl:types>
    2    <xsd:schema targetNamespace="http://test.org/AccountPollInterface/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3      <xsd:element name="SFDCPollAccountsResponse" type="tns:SFDCPollResponse" />
    4      <xsd:complexType name="SFDCPollResponse">
    5        <xsd:sequence>
    6          <xsd:element name="SFDCOutput" type="xsd:string" />
    7        </xsd:sequence>
    8      </xsd:complexType>
    9    </xsd:schema>
    10  </wsdl:types>