【Salesforce Apex】外部APIをCallする|実例紹介

※本サイトにはプロモーション・広告が含まれています。

(最新更新月: 2024年1月)

✔以下の疑問をお持ちの方へ向けた記事です

「Salesforce Apexで外部のAPIを呼び出す方法は?」
「ApexからAPIを呼び出す際のベストプラクティスは?」
「API呼び出しにおける認証やエラー処理の扱い方は?」

✔当記事を読むことで得られる知識

  • Salesforce ApexからのAPI呼び出しの基本概念とプロセス
  • HTTPリクエストとレスポンスの扱い方
  • API呼び出しに関連する認証、セキュリティ、エラー処理のベストプラクティス

ApexでのHTTPリクエストの作成、送信、およびレスポンスの取得方法を紹介し、RESTful APIやSOAP Webサービスへのアクセスの例を提供します。

Salesforceの開発者にとって、外部システムと連携するための重要なガイドとなるはずです。

ぜひ最後までご覧ください。

Salesforce

定義や属性などは公式ガイドを必ず参考にしましょう。

当記事では、主にその使い方を具体例とともに解説します。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

プロダクトマネージャーとして、Apex・Visualforceの開発エンジニアとして、以下のようなプロジェクトに従事してきました

  • 新規事業の立ち上げに伴うビジネスプロセス構築とSalesforceのカスタマイズ
  • SFDXを活用した大規模リリース
  • Visualforce等による一般ユーザー向けサイト・アプリケーションの構築

相談・業務の依頼も承ります。ご質問・ご希望をお問い合わせください。

ApexにおけるAPI呼び出しの基本

こちらでは、ApexでのAPI呼び出しの基本について詳しく解説していきます。

APIのしくみやSalesforce内での役割理解を深めることで、より効率的なアプリケーション開発が可能になるでしょう。

  • API呼び出しとは何か
  • Salesforce ApexでのAPIの役割
  • REST APIとSOAP APIの基本

API呼び出しとは何か

API呼び出しとは、アプリケーションやサービス間でデータをやり取りするためのプログラミング手法のひとつです。

具体的には、HTTPリクエストを使用して、外部のサービスにアクセスし、以下のような操作をおこなえます。

  • データを取得
  • データの更新
  • データの削除

例えば、Salesforce内のApexコードで、外部の天気予報サービスAPIから天気情報を取得する、など。

初心者でも理解しやすいように、ここではApexのコード例と共に、その基本を説明します。

Salesforce ApexでのAPIの役割

Salesforce上でAPIを使用することで、多くのメリットがもたらされます。

APIを通じて、外部システムとデータを同期したり、複雑なビジネスロジックを処理したりするが可能だからです。

例えば、HttpRequestクラスを使用して、外部の認証サービスにPOSTリクエストを送信し、ユーザー認証を実行することが可能です。

簡単にいえば、POSTリクエストは「送信」、GETリクエストは「取得」のときに使えます。

このように、ApexとAPIの組み合わせによりSalesforce環境を拡張し、アプリケーションの機能を向上させられます。

REST APIとSOAP APIの基本

ApexでAPIを利用する際の主要なプロトコルは以下の2つです。

  • REST (Representational State Transfer) : HTTPプロトコルを使用してシンプルで柔軟な接続
  • SOAP (Simple Object Access Protocol) : XMLベースでより厳密な規約を持つ

Apexでは、Httpクラスを使用してREST APIにリクエストし、WebServiceキーワードでSOAP APIを定義できます。

例としてRESTの場合、HttpRequestオブジェクトを生成し、URLやヘッダー、リクエストボディを設定することでGETやPOSTの操作が実行可能。

この2種類のAPIを理解することは、異なるシステムとの交信に重要です。

ApexでのAPI呼び出しの実装

実際にApexでAPIを呼び出すには、いくつかのステップを踏む必要があります。

こちらを理解することで、実際のコーディングにおいてスムーズにAPIを利用できるようになるでしょう。

  • HTTPリクエストの作成と送信
  • APIレスポンスの処理
  • エラーハンドリングと例外処理

HTTPリクエストの作成と送信

HTTPリクエストを作成し、送信するためには、ApexのHttpRequestクラスを使用します。

  1. HttpRequestオブジェクトを生成
  2. リクエストするURLを指定
  3. HTTPメソッド(GET、POST、PUT、DELETEなど)を設定
  4. 必要に応じてリクエストヘッダーやボディを追加

以下にサンプルコードを示します。

HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/data');
req.setMethod('GET');

HttpResponse res = new Http().send(req);

このコードは、特定のエンドポイントに対してGETリクエストを送信し、結果をHttpResponseオブジェクトで受け取れるもの。

初めての方でもシンプルなこのステップをマスターすることで、APIとのコミュニケーションの基本を把握できます。

APIレスポンスの処理

APIからのレスポンスを得た後、それを適切に処理することが重要です。HttpResponseクラスを使用してレスポンスのステータスコード、ヘッダーや本文を取得できます。レスポンスの本文は通常JSONやXML形式で返されるので、JSON.deserializeXmlStreamReaderを使用してパース(解析)する必要があります。例えば:

HttpResponse res = new Http().send(req);

if (res.getStatusCode() == 200) {
    // 成功した場合の処理
  Map<String, Object> results = (Map<String, Object>)JSON.deserializeUntyped(res.getBody());
    // レスポンスデータの操作
} else {
    // エラー処理
}

上記のコードでは、ステータスコードが200(成功)の場合、レスポンス本文をMapオブジェクトに変換。

この処理を一通り理解することで、APIから取得したデータをアプリケーション内で利用する方法を学べます。

エラーハンドリングと例外処理

API呼び出しには失敗がつきものです。

以下が原因でエラーが発生することがあります。

  • ネットワークの不具合
  • APIサーバーのダウン
  • 構文エラー

このような場合に備え、エラーハンドリングと例外処理が欠かせません。

Apexには例外を捉える try-catch ブロックが用意されており、これを使用してエラーを適切に処理します。

例えば以下のように記述します。

try {
    HttpResponse res = new Http().send(req);
    // APIレスポンスの処理
} catch (Exception e) {
    System.debug('エラーが発生しました: ' + e.getMessage());
    // 例外処理
}

コードでは、tryブロック内でリクエストを送信し、もし何らかの例外が発生した場合、catchブロックでその例外を捉えています。

プログラムがクラッシュすることなく、エラー情報をログに記録したり、ユーザーに通知したりする処理をおこなうのです。

API呼び出しの実践的な応用

こちらでは、API呼び出しの具体的な応用例について解説します。

APIを利用することでSalesforceアプリケーションの機能を拡張し、外部システムとの連携やリアルタイムでのデータ操作、カスタムAPIの開発をおこなえます。

未来の開発にこれらの応用技術が役立つことでしょう。

  • 外部システムとのデータ統合
  • リアルタイムデータの取得と操作
  • カスタムAPIの利用シナリオ

外部システムとのデータ統合

Salesforce内のデータと外部システムを統合することで、データの一元管理とビジネスプロセスの効率化を実現できます。

例えば、ERPシステムと連携して在庫情報を同期するために、外部システムが提供するAPIに対してApexからリクエストを送る、など。

以下のようなコードで実装されることが多いです。

HttpRequest req = new HttpRequest();
req.setMethod('POST');
req.setEndpoint('https://api.inventory-system.com/update-stock');
req.setHeader('Content-Type', 'application/json');
req.setBody(JSON.serialize(stockData));

Http http = new Http();
HttpResponse res = http.send(req);

if (res.getStatusCode() == 200) {
    // 在庫情報の更新成功
}

この例では、外部の在庫管理APIに対して在庫データを送信し、応答を受け取っています。

APIを通じたデータのやり取りを理解することで、異なるシステム間でシームレスに情報を同期することが可能です。

リアルタイムデータの取得と操作

リアルタイムデータの取得と操作により、Salesforceの力を最大限に引き出せます。

例えばソーシャルメディアのトレンド分析はその一例です。

TwitterのStreaming APIでデータストリームを受信し、そのデータを分析しSalesforceに保存する

これには以下のようなコードが使われることでしょう。

public class TwitterStreamHandler {
    private static final String CONSUMER_KEY = 'YOUR_TWITTER_CONSUMER_KEY';
    private static final String CONSUMER_SECRET = 'YOUR_TWITTER_CONSUMER_SECRET';
    private static final String ACCESS_TOKEN = 'YOUR_TWITTER_ACCESS_TOKEN';
    private static final String ACCESS_TOKEN_SECRET = 'YOUR_TWITTER_ACCESS_TOKEN_SECRET';
    private static final String TWITTER_STREAM_URL = 'https://stream.twitter.com/1.1/statuses/filter.json';

    // Twitter Streaming APIに接続するメソッド
    public static void connectToTwitterStream() {
        // Twitter認証ヘッダーの生成
        String authHeader = generateTwitterAuthHeader(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

        // HTTPリクエストの設定
        HttpRequest req = new HttpRequest();
        req.setEndpoint(TWITTER_STREAM_URL);
        req.setMethod('POST');
        req.setHeader('Authorization', authHeader);

        // リクエストの実行とレスポンスの取得
        Http http = new Http();
        HttpResponse res = http.send(req);

        // Twitterストリームからのデータの処理
        processTwitterStream(res.getBody());
    }

    // Twitter認証ヘッダーを生成するメソッド
    private static String generateTwitterAuthHeader(String consumerKey, String consumerSecret, String accessToken, String tokenSecret) {
        // 認証ヘッダーの生成ロジック
        // ...
        return '生成された認証ヘッダー';
    }

    // Twitterストリームからのデータを処理するメソッド
    private static void processTwitterStream(String streamData) {
        // ストリームデータのパース
        // ...

        // Salesforceに保存するロジック
        saveDataToSalesforce(parsedData);
    }

    // Salesforceにデータを保存するメソッド
    private static void saveDataToSalesforce(ParsedData data) {
        // Salesforceのオブジェクトにデータをマッピング
        // ...

        // データの保存
        insert mappedData;
    }
}

リアルタイムでデータの取得と操作を実装するには、非同期処理や高いリクエスト処理能力が求められます。

このスキルを身に付けることで、迅速かつ正確なビジネス判断が可能になるでしょう。

カスタムAPIの利用シナリオ

Salesforceの拡張性を活かしてカスタムAPIを開発できます。

独自のAPIを作成し、ほかのアプリケーションからアクセス可能にすることで、特定のビジネスニーズに合わせたデータ処理や分析が可能です。

たとえば、特定の条件に応じて顧客データを更新するカスタムAPIを以下のようにApexで作成できます:

@RestResource(urlMapping='/CustomerUpdate/*')
global with sharing class CustomerUpdateService {
    @HttpPost
    global static String updateCustomer(String customerId, String newData) {
        // カスタマーの情報を更新するロジック
        return '更新完了';
    }
}

このコードはRestResourceアノテーションを使用してRESTful APIを定義しており、POSTメソッドを使って顧客情報を更新できます。

カスタムAPIの開発は、Salesforce内外のアプリケーションをつなぐ一つの手段として非常に強力です。

API呼び出しのベストプラクティス

こちらでは、それぞれの観点から最適なAPI利用方法を探っていきます。

API呼び出しを安全かつ効率的におこなうためには、セキュリティ、パフォーマンス、リクエストの管理などのベストプラクティスを守ることが重要です。

正しいプラクティスを身に付ければ、信頼性の高いアプリケーション開発が実現します。

  • セキュリティと認証の管理
  • パフォーマンスの最適化
  • APIリクエストの制限と管理

セキュリティと認証の管理

APIを安全に利用するには、セキュリティ対策と認証の管理が不可欠です。

通信はSSL(Secure Socket Layer)を使用して暗号化し、APIキー、OAuthトークン、またはJWT(JSON Web Tokens)を利用して認証をおこなうべきです。

例えば、OAuth 2.0を使用してセキュアにAPIデータへアクセスするコードは以下のようになります。

// OAuth2認証の設定
HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/oauth/token');
req.setMethod('POST');
req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
req.setBody('grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET');

Http http = new Http();
HttpResponse res = http.send(req);
String accessToken;
if (res.getStatusCode() == 200) {
    Map<String, Object> authResponse = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
    accessToken = (String)authResponse.get('access_token');
}

ここでは、OAuth2を使用してアクセストークンを取得し、そのトークンを使ってAPIに安全にアクセスしています。

正確な認証管理を行うことは、情報漏洩や不正利用のリスクを大幅に減少させます。

パフォーマンスの最適化

APIリクエストのパフォーマンスを最適化することで、ユーザー体験を向上させられます。

  • リクエストの数を最小限に抑え、レスポンスデータをキャッシュするなどの手法を使う
  • バッチ処理や非同期処理を活用する

例えばバルクAPIを使用することで、複数のレコードを一度に処理することが可能です。

大量のデータを効率的に処理するためにバルクAPIを使用すると、ひとつひとつのリクエストに比べて効率的に作業を完了させられます。

パフォーマンス最適化の技術を習得することで、より高速な応答のサービスを提供できます。

APIリクエストの制限と管理

API呼び出しでは、そのリクエスト発行数を管理することが重要です。

Salesforce組織ごとのAPIリクエスト制限を超過すると追加料金が発生したり、サービスが停止されたりする可能性があるからです。

これらのリクエストを監視し、適切に管理する方法には、以下のようなものがあります。

// API呼び出しのリクエスト数を計測するコード例
Integer beforeCallout = Limits.getCallouts();
// APIを呼び出す処理
// ...
Integer afterCallout = Limits.getCallouts();
System.debug('このトランザクションで使用されたAPI呼び出し回数: ' + (afterCallout - beforeCallout));

組織のリクエスト制限を超えないように、Limitsクラスを利用して呼び出した回数を常にチェックし、必要に応じてリクエストを調節します。

これにより、過剰な料金を避けると同時にサービスの停止を防げるのです。

API呼び出しのトラブルシューティング

APIの問題やエラーに直面することは避けられませんが、適切なトラブルシューティング手順によって迅速に問題を解決できます。

これらの知識を持つことで、いざという時に素早い対応が可能となります。

  • 一般的なAPI関連の問題
  • デバッグとロギング
  • APIのバージョン管理とアップデート

一般的なAPI関連の問題

よく遭遇するAPI関連の問題には、以下のようなものがあります。

  • 認証エラー
  • リクエスト制限のオーバー
  • 不正なエンドポイントへのアクセス

これらはAPIドキュメンテーションの確認、アクセストークンの有効性のチェック、リクエスト回数の監視を通じて解決できます。

エラー発生時は、ステータスコードやエラーメッセージを注意深く検証しましょう。

たとえば、401 Unauthorized はアクセストークンの問題を示しています。

デバッグとロギング

問題発生時の迅速な対応には、効果的なデバッグとロギングが不可欠です。

SalesforceではSystem.debugを使って情報をデバッグログに記録し、Developer ConsoleやSalesforceのロギングツールで確認できます。

適切なログレベルを設定することで、問題の特定と解決までの時間を短縮が可能です。

System.debug(LoggingLevel.INFO, 'リクエストの開始');
try {
    // API呼び出しの実行
} catch (Exception e) {
    System.debug(LoggingLevel.ERROR, 'エラー発生: ' + e.getMessage());
}

コードの各段階で適切なログを残すことで、問題の原因を特定しやすくすることが重要です。

APIのバージョン管理とアップデート

アプリケーションの安定稼動を確保するためには、APIのバージョンを定期的にチェックして必要に応じてアップデートすることが必要です。

なぜならAPIは時間と共に進化し、新しいバージョンがリリースされたり非推奨になったりするから。

Salesforceでは、APIのバージョンがログインURLなどに含まれています。

最新のドキュメンテーションを確認し、新機能や変更点を監視しましょう。

// 新しいAPIバージョンへの対応コード例
req.setEndpoint('https://api.example.com/v2/data');

古いバージョンのAPIは非推奨となりサポートが打ち切られることがあるため、APIのバージョンアップデートを怠らないようにしましょう。

まとめ

SalesforceのApexを使用してAPI呼び出しを行う際には、基本的な概念の理解から実装、応用、ベストプラクティス、トラブルシューティングに至るまでの幅広い知識が必要です。

当記事を通じて、それぞれのステップにおけるポイントやテクニックを理解し、Salesforce開発におけるAPIの利用をマスターするための基礎を築くことができたはず。

リアルタイムで連携するデータ駆動型のアプリケーション作りを目指し、API技術を活かしてビジネスを加速させましょう。

タイトルとURLをコピーしました