はじめに
Salesforceには宣言的開発機能*が充実しています。中でも、複雑な機能を実現しようとする場合には、独自開発言語「Apex」を活用する場面が多いです。
Apexとは、Salesforce独自のオブジェクト指向プログラミング言語です。世界中で使用されているプログラミング言語「Java」とよく似ているという特徴があります。
外部Webサービスを利用する際、FacebookやGoogleといった主要なサービスについては、簡単に設定が構築できるよう宣言的な手順が用意されています。そんな中、カスタマイズ性の高さからApexを使用した方法で実装したいという場面もあると思います。
例えば、以前ご紹介したデータインテグレーションツール「DataSpider Cloud」の機能をSalesforceから起動したい場合は、Basic認証を使用したコールアウトをApexで実行するという方法があります。
今回は、Apexで外部Webサービスを利用しようと考えている方へ向けて、事前に必要な設定やサンプルコードをご紹介いたします。

*どのような結果になるのか、宣言するように開発すること。コードを書かずともクリックベースでアプリケーションの定義をマウスで行い、最小限の専門知識で開発が可能。
Salesforceにおける”コールアウト”とは
簡潔に説明すると、HTTP要求を送信して応答を受信することでSalesforceと外部Webサービスを統合できる仕組みです。
例えば、コールアウトを使用することで
- 地図APIを使用して住所情報を取得する。
- 気象情報サービスAPIを使用して気象条件を取得する。
などが可能になります。
より詳細な内容はSalesforce公式をご確認ください。
Salesforce公式ヘルプページ:https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_callouts.htm
リモートサイト設定
まずは、コールアウトを使用する外部Webサービスを事前に登録しておく必要があります。
手順1. [設定]>[セキュリティ]>[リモートサイトの設定]と進み、[新規リモートサイト]をクリックします。

図1:新規リモートサイト
手順2. No.1~4の設定を入力し、[保存]をクリックします。
No. | 設定 | 値 |
---|---|---|
1 | リモートサイト名 | 任意の値 |
2 | リモートサイトのURL | 外部サービスのURL |
3 | 説明 | 任意の値 |
4 | 有効 | チェックあり |

図2:リモートサイト作成
これで、リモートサイト設定は完了です。保存した設定のURL宛にコールアウトを使用することができるようになります。
Apexクラス作成
ApexにはHTTPのクラスが用意されています。
Httpクラス | HTTP要求と応答を開始に使用する。 |
HttpRequestクラス | GET、POST、PATCH、PUT、DELETEのようなHTTP要求に使用する。 |
HttpResponseクラス | HTTPで返されたHTTP応答の処理に使用する。 |
これらのクラスを使用して実装していきます。
public class HttpCalloutSample {
private static String BASIC_USER = 'hogehoge';
private static String BASIC_PW = 'fugafuga';
@future(callout=true)
public void HttpCalloutSample() {
try {
String url = 'https://example.com';
Blob headerValue = Blob.valueOf(BASIC_USER + ':' + BASIC_PW);
String authorizationHeader = 'BASIC ' + EncodingUtil.base64Encode(headerValue);
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setHeader('Authorization', authorizationHeader);
req.setEndpoint(url);
req.setMethod('POST');
HttpResponse res = h.send(req);
if (res.getStatusCode() == 200) {
System.debug('OK');
}
} catch(exception ex) {
System.debug('error: ' + ex);
}
}
}
サンプルコード
Basic認証
Basic認証では、Authorizationヘッダに、「Basic」「1つの空白」「ユーザ名とパスワードの組みをコロンでつなぎ、Base64でエンコードしたもの」を指定する必要があります。
Salesforceでは、EncodingUtilクラスに用意されているメソッドを使用して、Base64でエンコードすることができます。
サンプルコードでは、2、3行目で定義したユーザ名とパスワードをBase64でエンコードする為に、9行目で一度Blob型に変換し、10行目でBase64でエンコードしています。
16行目では、Authorizationヘッダに10行目で作成した認証情報を指定しています。
public class HttpCalloutSample {
private static String BASIC_USER = 'hogehoge';
private static String BASIC_PW = 'fugafuga';
@future(callout=true)
public void HttpCalloutSample() {
try {
String url = 'https://example.com';
Blob headerValue = Blob.valueOf(BASIC_USER + ':' + BASIC_PW);
String authorizationHeader = 'BASIC ' + EncodingUtil.base64Encode(headerValue);
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setHeader('Authorization', authorizationHeader);
:
Basic認証情報の作成
@future(callout=true)
トリガからコールアウトを使用して外部Webサービスを呼び出す場合、@future(callout=true)を追加していないとエラーになってしまいます。
System.CalloutException: Callout from triggers are currently not supported.
出力されるエラー例
@futureアノテーションを使用したメソッドは非同期に実行されるようになり、コールアウトを使用する場合は更に(callout=true)でマークします。
サンプルコードでは、5行目に@futureアノテーションを追加しています。
public class HttpCalloutSample {
private static String BASIC_USER = 'hogehoge';
private static String BASIC_PW = 'fugafuga';
@future(callout=true)
public void HttpCalloutSample() {
try {
:
@futureアノテーションの追加
実行例
Basic認証を使用したコールアウトを実装したApexを、実行した際の結果の例です。
開発者コンソールのデバッグログには、「CALLOUT_REQUEST」「CALLOUT_RESPONSE」があるのが確認できます。(図3赤枠部分)

図3:Apex実行結果の例
CALLOUT_REQUESTでは、外部Webサービスへのコールアウトについての情報が記載されています。
CALLOUT_RESPONSEでは、正常終了を表すステータスコード”200”が返ってきています。Basic認証やコールアウトがうまくいっていない場合は、“200”以外のステータスコードが返ってきます。
最後に
Apexで実装するBasic認証を使用した、外部Webサービスへのコールアウトついてご紹介しました。
昨今、Salesforce開発で外部Webサービスを利用する場面が多くなってきています。冒頭にも述べたように、宣言的に外部Webサービスの使用を構築できるようになってきています。Apexでの実装が必要な際に本記事がご参考になれば幸いです。
投稿者プロフィール

-
主にSalesforceを使用した開発を担当しており、Salesforce歴は3年程です。
フローを使ったローコードでの実装や、Apexを使用したバックエンドの構築を担当しております。最近では、Lightning Web Componentや、第2世代管理パッケージの開発にも携わっております。
保有資格:Salesforce認定platformデベロッパー
最新の投稿
Salesforce2024.05.22【Salesforce】Apexとフローで異なる!オブジェクトのデータ並び替え(ソート)実装方法を徹底解説
Salesforce2023.11.22【Salesforce】Apexで実装しよう!Basic認証を使用したコールアウトの紹介【サンプルコード付き】
Salesforce2023.05.23【Salesforce】セキュリティトークンを使用して、DataSpider Cloudのグローバルリソースに接続設定を作成する
Salesforce2022.12.13【Salesforce】フローでループを使う際の厄介なエラー「Number of Iterations Exceeded」をプラットフォームイベントトリガフローで回避する