クセが強いwebserviceメソッド

今回は暗記モノです。
この内容に限らず、制約事項が多いものはテストで出題されやすいので、チェックしておきましょう。

スポンサーリンク

webserviceメソッドとは?

カスタムの SOAP Web サービスコールとして公開するメソッドです。
自分で作成したApexクラスをSOAP から呼び出すことができます。

webserviceメソッドを使えるようにするには

webserviceメソッドはただ作ればいいだけではありません。
SOAPとして使用できるようにしないといけないので、クライアント側にWSDL定義を取り込まないといけません。

具体的な手順として、まずwebserviceメソッド付きのApexクラスを作成します。
Apex開発者ガイドのソースコードを拝借して、以下Apexクラスを作ります。
MyWebService.cls

global class MyWebService {
    webservice static Id makeContact(String contactLastName, Account a) {
        Contact c = new Contact(lastName = contactLastName, AccountId = a.Id);
        insert c;
        return c.id;
    }
}

設定→Apexクラスで作成したApexクラスを見ると、「WSDL」というリンクがあるので、ここをクリックします。
webserviceメソッドを作成するとWDSLリンクが表示される

XMLでひたすら書かれていますが、これをダウンロードしてクライアント側に取り込めば使えるようになります。
WSDLファイルの内容

注意点がいろいろあります

webserviceメソッドを扱う上での注意点がいくつかあります。
作り方うんぬんは前フリで、これから挙げる考慮点がテストで出題されがちです。
今回はまとめはありませんので、注意点を押さえておきましょう。

◆クラスはglobalにしないといけない

◆最上位メソッドと外部クラスメソッドの定義には、webserviceキーワードを使用する

◆webserviceはstaticメソッドにする必要がある

◆トリガ内で使用できない

◆システム定義の列挙型は webserviceメソッドで使用できない
→カスタムクラスを引数とすることは可能。
その場合、クラスはglobalとなり、クラス内のメンバ変数はwebserviceにする必要がある。
WSDLに定義されていれば、オブジェクトも引数にすることも可能。
カスタムクラスを使用する場合は、このようにメンバ変数に対してwebserviceをつける。

global class MyWebService {
    global class ContactInfo {
        webservice String contactLastName;
        webservice Account a;
    }
    webservice static Id makeContact(ContactInfo cinfo) {
        Contact c = new Contact(lastName = cinfo.contactLastName, AccountId = cinfo.a.Id);
        insert c;
        return c.id;
    }
}

◆メソッドのオーバーロードはサポートされない
→同じメソッド名で引数が異なるオーバーロードはコンパイルエラーが発生。以下のようなコードはNG。

global class MyWebService {
    webservice static Id makeContact(String contactLastName, Account a) {
        Contact c = new Contact(lastName = contactLastName, AccountId = a.Id);
        insert c;
        return c.id;
    }

    webservice static Id makeContact(String contactLastName, String contactFirstName, Account a) {
        Contact c = new Contact(lastName = contactLastName, firstName = contactFirstName, AccountId = a.Id);
        insert c;
        return c.id;
    }
}

ちなみに、コンパイルエラーはこういう内容。

Web Service does not support two web service methods with the same name

◆SOAPでログインしたユーザに関係なくシステムコンテキストが使用される
→権限、項目レベルのセキュリティ、共有ルールに関係なく、全機能を使用できてしまうため、権限には留意する

コメント