ブログ

【Salesforce】Apexで実装しよう!Basic認証を使用したコールアウトの紹介【サンプルコード付き】

この記事をSNSでシェア!

はじめに

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デベロッパー
この記事をSNSでシェア!