このエントリは、 Force.com Advent Calendar 2011 12/24 の記事です。


ネタが思いつかないため、今回は Summer'11でパイロットリリースになり、
Winter'12で本リリースになった ApexRestについての紹介をします。

Apex REST とは

RESTで ApexCode の実行ができます。

クラス定義

REST のリソースに該当するクラスには、
@RestResourceアノテーションを使用し、

@RestResource(urlMapping='/Account/*')

というふうに、そのクラスが対応するURLを指定します。

また、同じクラス内に複数の同一のHTTPメソッドを複数定義することはできません。
URL定義
RestResourceアノテーションのurlMappingには、
https://[instance].salesforce.com/services/apexrest
以下のパスを定義します。
URLは、「/」から始まらなければならず、
ワイルドカードとして「*」が使用できます。
クラスに名前空間がある場合、URLのapexrest と urlMappingの値の間に名前空間が入ります。

URLマッピングの優先順位
複数のマッピングに該当するリクエストが来た場合、

まず完全一致したものは最優先で発動します。

それからワイルドカードつきで該当するものが複数存在している場合には、
ワイルドカード以外の文字列が長いものが優先されます。
例)
urlMapping='/Account/*' と urlMapping='/*/*' が存在し、
/Account/001F000000aaaaa にアクセスした場合、
urlMapping='/Account/*' のほうが実行されます。

また、該当する文字列の数も同じ場合には、
ワイルドカードが後ろにあるほうが優先されるようです。
例)
urlMapping='/aaa/*' と urlMapping='/*/aaa' が存在し、
/aaa/aaa にアクセスした場合、
urlMapping='/aaa/*' のほうが実行されます。


メソッド定義

@RestResource アノテーション付きのクラス内の global static メソッドに、
@HttpGet, @HttpPost, @HttpDelete, @HttpPatch, @HttpPut
のアノテーションを付与できます。
それぞれのアノテーションが各HTTPメソッドに対応しており、
GETメソッドのリクエストでは @HttpGet アノテーションが付与されたメソッドが、
POSTメソッドのリクエストでは @HttpPost アノテーションのメソッドが実行されます。

戻り値として使用できるのは、
  • プリミティブ型
  • SObject型
  • プリミティブ型のList
  • キーがString、値がプリミティブ型のMap
です。

サンプル

@RestResource(urlMapping='/Account/*')
global with sharing class MyRestResource {
    
    @HttpGet
    global static Account doGet(RestRequest req, RestResponse res) {
        String uri = req.requestURI;
        String accountId = uri.substring(uri.lastIndexOf('/') + 1);
        Account result = [SELECT 
                              Id, Name, Phone, Website
                          FROM Account WHERE Id = :accountId];
        return result;
    }
    
    @HttpPost
    global static String doPost(
        RestRequest req,
        RestResponse res,
        String name,
        String phone, String website
    ) {
        Account account = new Account(
            Name    = name,
            Phone   = phone,
            Website = website
        );
        insert account;
        return account.Id;
    }
    
}

apigeeで確認

以前、Salesforceのwebinarで紹介されていた、
apigeeを使って動作を確認してみましょう。


まずはapigeeのコンソールを開き、

鍵マークのメニュー内のOAuthから、apigeeからSalesforceへの接続を許可します。

apigee-1 作成したクラスのURLを入力し、GETボタンを押しましょう。 apigee-2 レスポンス(この場合だと取引先の情報)が表示されます。 apigee-3

次にPOSTメソッドで接続してみましょう。

GETボタンの左のメニューから、POSTを選択して、メソッドをPOSTに切り替えます。

apigee-4-0 次にPOST内容を設定するため、URL右にある、歯車アイコンをクリックします。 apigee-4 出現したダイアログにPSOT内容を設定します。 apigee-5 OKをクリックしてダイアログを閉じ、POSTボタンを押下します。 apigee-6 設定した内容で取引先が作成され、IDが返ってきました。