この記事の目次
Salesforce RestResourceとは?

global class MyClass {
@future
Public static void myMethod(String a)
{
//long-running Apex code
}
}
RestResourceアノテーション

RestResourceアノテーションの留意点
SalesforceのRestResourceアノテーションでは、以下のような留意点があります。 1. URLパスは「https://instance.salesforce.com/services/apexrest/{指定URL}」となります。 2. ワイルドカード文字「*」が使用できます。 3. URLパスでは、大文字と小文字が区別されます。 4. SalesforceでRestResourceアノテーションを使用する場合は、Apexクラスをグローバル定義しておく必要があります。URLパスのルール
RestResourceのURLパスの対応付けルールは次の通りです。 1. URLパスは、「/」で開始します。 2. 「*」がある場合、その前と後に「/」を付ける必要があります。ただし、「*」がURLパスの末尾である場合は後ろの「/」は不要です。 3. 常に完全一致が優先となります。 4. 完全一致がない場合は、ワイルドカード「*」で一致するすべてのパターンを検索して、一致した中の一番長い文字列が選択されます。 5. ワイルドカード「*」で一致するものが無い場合、HTTP応答状況コード404を返します。 6. 名前空間のあるクラスの場合はURLパスに名前空間が含まれます。 https://instance.salesforce.com/services/apexrest/{名前空間}/{指定URL}/RestResourceサンプルコード(1)
以下は、レコードの削除、取得、更新を行う3つのHTTP要求メソッドのサンプルコードです。@RestResource(urlMapping='/Account/*')
global with sharing class MyRestResource {
@HttpDelete
global static void doDelete() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
String accountId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
Account account = [SELECT Id FROM Account WHERE Id = :accountId];
delete account;
}
@HttpGet
global static Account doGet() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
String accountId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE Id = :accountId];
return result;
}
@HttpPost
global static String doPost(String name,
String phone, String website) {
Account account = new Account();
account.Name = name;
account.phone = phone;
account.website = website;
insert account;
return account.Id;
}
}
サンプルコードの説明
以下にサンプルコードの説明をします。 1. @RestResourceで指定URLに「/Account/*」を宣言しています。 2. @HttpDeleteを宣言することで、HTTP DELETE要求が送信されるとdoDeleteメソッドを実行します。 3. @HttpGetを宣言することで、HTTP GET要求が送信されるとdoGetメソッドを実行します。 4. @HttpPostを宣言することで、HTTP POST要求が送信されるとdoPostメソッドを実行します。doGetメソッドのコール
サンプルコードで、クライアントからdoGetメソッドをコールする場合は、コマンドラインウィンドウにコマンドを入力し実行します。 入力するのは次のコマンドです。curl -H "Authorization: Bearer sessionId"
"https://instance.salesforce.com/services/apexrest/Account/accountId"
「sessionId」には、ログイン時のsessionIdを指定します。
「instance」には、Server URLを指定します。
「accountId」には、取引先IDを指定します。
doGetメソッドをコールした後、Salesforceからは次のようなJSON応答が返ってきます。
{
"attributes" :
{
"type" : "Account",
"url" : "/services/data/v22.0/sobjects/Account/accountId"
},
"Id" : "accountId",
"Name" : "Acme"
}
RestResourceサンプルコード(2)
次のサンプルコードは、もう少しシンプルなものです。 以下のサンプルコードでは、HTTP GET要求時はパラメータから名前を取得して文字列を返し、HTTP POST要求時は引数から名前を取得して文字列を返します。@RestResource(urlMapping='/SayGoodbye/*')
global with sharing class SayGoodbyeApi {
@HttpGet
global static String doGet() {
RestRequest req = RestContext.request;
String name = req.params.get('name');
return 'Goodbye ' + name;
}
@HttpPost
global static String doPost(String name) {
return 'Goodbye ' + name;
}
}
サンプルコードのテストプログラム
以下はサンプルコードをテストするプログラム例です。 isTestアノテーションは、テスト用のメソッドやクラスを定義する場合に使用します。@isTest
private class SayGoodbyeApiTest {
/*** Postの確認を行う ***/
private static testMethod void doPostTest() {
String result;
Test.startTest();
result = SayGoodbyeApi.doPost('MyName');
Test.stopTest();
system.assertEquals(result, 'Goodbye MyName');
}
/*** Getの確認を行う ***/
private static testMethod void doGetTest() {
String result;
RestRequest req;
RestResponse res;
// リクエストの作成
req = new RestRequest();
req.httpMethod = 'GET';
req.requestURI = '/services/apexrequest/SayGoodbye/?name=MyName';
// レスポンスの作成
res = new RestResponse();
// コンテキストの設定
RestContext.request = req;
RestContext.response = res;
Test.startTest();
result = SayGoodbyeApi.doGet();
Test.stopTest();
system.assertEquals(result, 'Goodbye MyName');
}
}
RestResource 外部からの呼び出し
外部からメソッドをコールする場合は事前にSalesforceの認証を行ってから呼び出す必要があります。 Salesforceにログインし「設定」→「作成」→「アプリケーション」→「接続アプリケーション」で認証を行います。 項目「コンシューマ鍵」、「コンシューマの秘密」と、ログイン時の「ユーザ名」、「パスワード」で認証を行い、アクセストークンを受け取ります。受け取ったアクセストークンをHTTPヘッダに設定すれば、REST APIメソッドをコールすることが可能となります。SalesforceのRestResourceを活用しよう!
