REST APIなどのAPI連携まわりがいまいち理解できていないので、少し勉強してみました。今回はRestResourceアノテーションの使い方について確認してみました。
@RestResourceとは
RestResourceアノテーションとはREST APIでApexクラスの処理を実行したいときに宣言するアノテーションです。
REST APIからApexクラスを実行する際のパスは次のようになっています。
https://instance.salesforce.com/services/apexrest/{指定URL}/
@RestResource(urlMapping='/Account/*')と宣言した場合は次のようなパスになります。
https://instance.salesforce.com/services/apexrest/Account/
このような感じでRestResourceアノテーションを宣言します。
@HttpGetについて
REST APIで実行するGET処理の実装方法です。GET処理用のメソッドを用意したい場合は『@HttpGet』を宣言します。
これでREST API実行時にクエリを実行して取得結果のリストを返したりするような処理を実装できます。
@HttpGetを宣言する場合は次のように『RestRequest』と『RestResponse』を引数として渡す必要がありました。
@RestResource(urlMapping='/RemoteActivation/*') global class as_remoteActivationService { @HttpGet global static String remoteActivation(RestRequest req, RestResponse res) { String company = req.params.get('company'); String street = req.params.get('street'); System.debug('COMPANY: ' + company); System.debug('STREET: ' + street); return 'Done'; }
最近のAPIバージョンではこの引数を渡す必要がなくなったみたいです。もし渡そうとすると次のエラーが発生します。
Save error: Invalid type: HTTP GET/DELETE methods do not support parameters
今は引数として渡さなくても『RestContext.request』というように『RestContext』から必要な情報を取得できるようになっているみたいです。
@HttpPostについて
レコードの取得などではなく、登録処理などを実行したい場合は『@HttpPost』を宣言したメソッドを用意します。
@HttpPostはこんな感じで普通のApex開発と同じように実装できると思います。戻り値にはsObject型で返すことも可能です。INSERT実行後はオブジェクトIDもきちんと戻すことができます。
Apex REST Annotationsの種類
開発者ガイドには次のアノテーションが紹介されていました。
- @RestResource(urlMapping='/yourUrl')
- @HttpDelete
- @HttpGet
- @HttpPatch
- @HttpPost
- @HttpPut
テストクラスの実装方法
Apex開発するときに重要なのはテストクラスです。テストクラスの実装方法を確認しておかないと実装したあとに困ったことになります。
RestResourceアノテーションをつかった処理で使える『RestContext』ですが、テストクラスでは自分で値を用意する必要があります。これを用意しないとNullExceptionのエラーが発生します。
テストクラスでRestContextの値を用意する処理は次のような感じです。
requestURIとGET / POSTなどのhttpMethodを指定してあげます。RestContextの値を用意したらあとはいつもと同じように実装することでテストクラスを作成できます。
この『RestContext』の値を用意するという点がRestResourceアノテーションを宣言したクラスのテストで忘れてはならないポイントだと思います。
@RestResourceの実装方法はこんな感じです。これで外部サイトからREST APIを実行してApexクラスの処理を呼び出す機能を実装できると思います。ちなみに@HttpGetなどのhttpMethodは1つのクラスに同じhttpMethodを複数宣言することはできないみたいです。
この辺りを注意しておけば問題なく実装できると思います。
サンプルコード
今回作成したサンプルコードはGitHubで公開しています。