実装に関する考慮事項
ほとんどの問題は、データ管理、使用制限、通信に関わるものです。
インテグレーション用のユーザーの選択
クライアントアプリケーションが API に接続するとき、最初にログインする必要があります。login() コール時には Salesforce にログインするためのユーザーを指定する必要があります。クライアントアプリケーションは、ログインユーザーの権限および共有設定に基づいて動作します。以降のセクションでは、クライアントアプリケーション用にユーザーを構成する方法について説明します。
権限
組織の Salesforce システム管理者は、プロファイルおよび権限セットを設定し、ユーザーをそれらに割り当てることによって、ユーザーが使用できる機能やビューを制御します。API にアクセスし、コールを発行してコール結果を受信するには、ユーザーに「API 対応」権限が与えられている必要があります。クライアントアプリケーションは、ログインユーザーの権限を介してアクセス権限を付与されるこれらのオブジェクトおよび項目のみを照会したり更新したりできます。
共有ルールによってデータへのアクセスを許可されたユーザーとしてのログインでは、API はアクセスを確認する追加のクエリを発行する必要があります。それを避けるには、「すべてのデータの編集」権限を持つユーザーとしてログインします。これによって、コールの応答時間を短縮できます。「すべてのデータの編集」権限を許可すると、特定のユーザーには権限範囲が広すぎることがあります。その場合は、オブジェクトレベルの権限である「すべて変更」を使用して、データのアクセスをオブジェクト単位に制限することを検討してください。
制限
複数のクライアントアプリケーションが、同じ username 引数を使用してログインできます。ただし、この方法ではクエリ制限によってエラーになるリスクが高くなります。
ログインサーバーへのログイン
クライアントアプリケーションは、他のコールを呼び出す前にまず login() コールを呼び出してログインサーバーとのセッションを確立する必要があります。次に、返されたサーバーの URL を後続の API 要求の要求先サーバーとして設定し、返されたセッション ID を SOAP ヘッダーに設定して後続の API 要求のサーバー認証が行えるようにする必要があります。Salesforce は、クライアントアプリケーションがログインしている IP アドレスを確認し、不明な IP アドレスからのログインをブロックします。詳細は、「login()」および「ステップ 4: サンプルコードを説明する」を参照してください。
API でブロックされたログインに関しては、Salesforce がログイン失敗エラーを返します。ログインするには、ユーザーがセキュリティトークンをユーザーパスワードの末尾に追加する必要があります。たとえば、パスワードが mypassword で、セキュリティトークンが XXXXXXXXXX の場合は、「mypasswordXXXXXXXXXX」と入力する必要があります。セキュリティトークンを取得するには、Salesforce ユーザーインターフェースからパスワードを変更するか、セキュリティトークンをリセットします。ユーザーがパスワードを変更するか、セキュリティトークンをリセットすると、ユーザーの Salesforce レコードに指定されたメールアドレス宛に新しいセキュリティトークンが送信されます。セキュリティトークンは、ユーザーがセキュリティトークンをリセットするか、パスワードを変更するか、またはユーザーのパスワードがリセットされるまで有効です。トークンが無効な場合、ユーザーはログインプロセスを再度行う必要があります。再度ログインを行わないようにするには、クライアントの IP アドレスを組織の信頼できる IP アドレスのリストに追加します。
ログイン後は、API コールを実行できます。それぞれの操作に対し、クライアントアプリケーションは同期要求を API に送信し、レスポンスを待ち、結果を処理します。API は変更されたデータを自動的にコミットします。
API コールには、次のようなものがあります。
一般的な API コールシーケンス
各コールに対し、クライアントアプリケーションは一般的に次の処理を行います。
- パラメーターを使用する場合、要求パラメーターを定義して要求の準備を行います。
- 要求とパラメーターを Lightning Platform Web サービスに渡し処理するためにコールを呼び出します。
- API からのレスポンスを受け取ります。
- 返されたデータを処理するか (呼び出しが成功した場合)、エラーを処理し (呼び出しが失敗した場合)、レスポンスを処理します。
Salesforce Sandbox
Professional Edition、Enterprise Edition、Unlimited Edition、および Performance Edition を使用している場合、Salesforce Sandbox にアクセスできます。これは、Salesforce 組織の本番データの全部または一部の複製を提供するテスト環境です。詳細は、Salesforce コミュニティの Web サイト (www.salesforce.com/community) にアクセスするか、Salesforce ヘルプの「Sandbox の種別およびテンプレート」を参照してください。
API を介して組織の Sandbox にアクセスするには、次の URL からログイン要求を行います。
API 使用状況の測定
最適なパフォーマンスを維持し、すべてのお客様が Lightning Platform API を使用できるようにするために、Salesforce は次の 2 つ種類の制限を設けることによって、トランザクションの負荷を調整しています。
- 同時 API 要求数の制限
- 合計 API 要求の割り当て
同時 API 要求数の制限
次の表は、20 秒以上の同時受信要求 (コール) 数について、さまざまな種類の組織に対する制限を示しています。
実行時間が長い要求の数が制限を超えた場合、API は REQUEST_LIMIT_EXCEEDED 例外コードを返します。新しい同時要求の処理は、要求数が制限より少なくなるまで行われません。たとえば、本番環境では、実行時間が長い要求が 25 個未満になるまで、新しい同時要求は許可されません。
20 秒より短い同時要求の数に制限はありません。
合計 API 要求の割り当て
次の表は、組織の 24 時間あたりの受信 API 要求 (コール) 数の合計に関する制限について示しています。
Experience Cloud の制限については、「Experience Cloud ユーザーライセンス」を参照してください。
この割り当てに含まれる API には、Lightning Platform REST API、Lightning Platform SOAP API、Bulk API、Bulk API 2.0 が含まれます。特定の Salesforce 接続アプリケーション (Salesforce モバイルアプリケーションなど) によって発行された API コールは計数されません。割り当てに影響を与える API を確認するには、「API 使用状況の監視」を参照してください。
DebuggingHeader を含むコールには、別途 24 時間あたり 1,000 コールの割り当て制限があります。組織の合計要求制限に達した後でも、これらのコールは引き続き実行できます。
コール数の制限および割り当ては、24 時間あたりに組織に対して行われた API コール数の集計に対して適用されます。この制限および割り当ては、ユーザーごとに適用されるものではありません。
API 使用状況の監視
組織の API 使用状況および制限をより詳細に監視するには、次のリソースを使用してください。
- [設定] の [システムの概要] ページの [API 使用状況] セクション。
- [設定] の [システムの概要] ページの [組織の詳細] セクションの [API 要求数 (この 24 時間以内)]。
- 使用量ベースのエンタイトルメントの [API Request Limit per Month (月間 API 要求制限)]。ここには、組織の API コールの 30 日間の集計が表示されます。[設定] の [組織情報] ページにあります。
- REST API の Sforce-Limit-Info 応答ヘッダーで返される情報。
- SOAP API の (<type>API REQUESTS</type> 内の) レスポンスボディで返される情報。
- Lightning Platform REST API の /limits コール。
API 要求が指定した割り当てコール数の割合を超えた場合に、メールで指定ユーザーに通知するように組織で設定できます。[設定] から、[クイック検索] ボックスに「API 使用状況通知」と入力し、[API 使用状況通知] を選択することで、この設定を実行します。
「App Development Without Limits (制限なしのアプリケーション開発)」 Trailhead モジュールの「Learn About Daily Rate Limits (1 日の転送制限について)」セクションも参照してください。
API 要求の制限に達すると、または制限を超えると何が起きるか
組織で 1 日の API 要求の制限に達するか、または制限を超えた場合、Salesforce は可能であれば、一定量の操作の続行を許可します。これにより、予期しないワークロードの急増やときどき発生するピーク期間においてワークフローがブロックされてしまうことを回避できます。プラットフォームリソースを保護し、API 要求が 1 日の上限を制限なく超えることがないようにするために、ハードキャップが設定されています。
API 要求活動が、契約開始日から始まる 30 日の期間で集計されます。この活動には、組織の制限を超えたコールが含まれます。
API 要求合計数の割り当ての増加
ユーザーライセンスに基づく API 要求数の計算は、ユーザー数に基づいて組織に十分な利用可能数を許可するように意図されています。要求数を増やす必要があるが、ユーザーライセンスの追加購入や Performance Edition へのアップグレー��を希望しない場合は、API コールを追加購入できます。詳細は、営業担当者にお問い合わせください。
API コールを追加購入する前に、API 使用状況を精査します。クライアントアプリケーションが独自のエンタープライズアプリケーションであってもパートナーアプリケーションであっても、最適化によって、同じ処理を行うのに使用する API コールを減らせる場合があります。パートナー製品をお使いの場合、供給メーカーにお問い合わせいただき、その製品での API の使用が最適化されていることを確認してください。API の使用効率のよくない製品は、会社に不要なコストを負わせることになります。REST API 複合リソースを使用して、クライアントとサーバー間の往復回数を最小限に抑えることでアプリケーションのパフォーマンスを高めることができます。
API 使用制限の計算例
次の例は、API 使用制限の計算について、いくつかのシナリオを通して説明しています。
- Salesforce ライセンスを 15 個割り当てられている Enterprise Edition 組織の場合、要求数の制限は 115,000 件です (100,000 + 15 個のライセンス x 1,000 件のコール)。
- 水曜日の午前 5 時に 14,500 件のコールが作成され、水曜日の午後 11 時に 499 件のコールが作成された Developer Edition 組織の場合、木曜日の午前 5 時まで正常に作成できるコール数はあと 1 件だけです。
保存されたサードパーティの更新トークンとアクセストークンの長さ
Salesforce で保存されるサードパーティのアクセストークンおよび更新トークンの長さは、最大 10,000 文字です。
圧縮
API は、HTTP 1.1 の仕様で定義された標準を使用した要求とレスポンスの圧縮をサポートしています。いくつかの SOAP/WSDL クライアントでは自動的にサポートされており、他のクライアントへも手動で追加できます。クライアント別の詳細は、https://developer.salesforce.com/page/Tools を参照してください。
圧縮は、クライアントが明示的に指定しない限り使用されません。パフォーマンス向上のため、HTTP 1.1 の仕様に従ったクライアント側での圧縮のサポートをお勧めします。
クライアントが圧縮をサポートしていることを示すには、HTTP ヘッダー「Accept-Encoding: gzip, deflate」または同様のヘッダーを含める必要があります。クライアントのヘッダーで正しく指定されている場合、API はレスポンスを圧縮します。レスポンスには、「Content-Encoding: deflate」または「Content-Encoding: gzip」のいずれか適切な方が含まれます。「Content-Encoding: deflate」または「gzip」をヘッダーに含めることで、あらゆる要求を圧縮することができます。
ほとんどのクライアントは、たとえ企業内 LAN を使用している場合も、ある程度のネットワーク接続の制限があります。API は圧縮をサポートすることでパフォーマンスを向上します。ほとんどすべてのクライアントでは、レスポンスを圧縮することのメリットがあり、多くのクライアントでは要求の圧縮でもメリットがあります。API は HTTP 1.1 の仕様に従い deflate と gzip 圧縮をサポートします。
レスポンスの圧縮
API は、必要に応じてレスポンスを圧縮することができます。 クライアント側から Accept-Encoding ヘッダーで gzip または deflate 圧縮を指定した場合、レスポンスは圧縮されます。Accept-Encoding が指定された場合でも API ではレスポンスを圧縮する必要はありませんが、通常は圧縮されます。API がレスポンスを圧縮した場合、API は使用した圧縮アルゴリズムの名前で Content-Encoding ヘッダーも指定します (gzip または deflate のいずれか)。
要求の圧縮
クライアントは要求を圧縮することもできます。API は、処理前にすべての要求を展開します。クライアントは、適切な圧縮アルゴリズムの名前を記した Content-Encoding HTTP ヘッダーを送信しなければなりません。詳細は、以下を参照してください。
- Content-Encoding については、www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11
- Accept-Encoding については、www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
- Content Coding については、www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5
HTTP 永続接続
ほとんどのクライアントでは、HTTP 1.1 の永続接続を使用し、複数の要求のソケット接続を再利用したほうがパフォーマンスが向上します。永続接続は通常 SOAP/WSDL クライアントが自動的に処理します。詳細は、次の HTTP 1.1 の仕様を参照してください。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1
国際化と文字コード
API は Unicode または ISO-8859-1 のいずれかの文字を完全にサポートしています。文字コードは、組織で使用されている Salesforce インスタンスごとに異なります。組織が ssl.salesforce.com にログインしている場合、エンコードは ISO-8859-1 です。その他のすべてのインスタンスは UTF-8 を使用します。 文字コードを判断するには、describeGlobal() をコールし、DescribeGlobalResult で返された encoding 値を確認します。
組織で ISO-8859-1 エンコーディングを使用している場合、API に送信されるすべてのデータを ISO-8859-1 で符号化する必要があります。有効な ISO-8859-1 の範囲外の文字は、切り捨てられるか、エラーとなります。
XML 準拠
API は XML をベースとしています。XML では、すべてのドキュメントが正しい形式であることが求められます。その要件の一部には、エスケープ文字などを使用してもある特定の Unicode 文字は XML ドキュメントでは許可されないと定められています。また、その他の文字も地域に応じたエンコードが必要です。通常、標準 SOAP クライアントまたは XML クライアントが処理します。クライアントは、一般的な XML エスケープシーケンスすべてを解析する機能を持ち、無効な XML 文字を渡さないようにする必要があります。
前述のとおり、文字によってはエスケープ文字などを使用していても無効です。無効な文字には、ペアになっていない Unicode サロゲートやその他のいくつかの Unicode 文字が含まれます。これらの文字は滅多に使用されず、どのデータでも通常は重要視されない制御文字であるため、多くのプログラムで問題となる場合があります。これらの文字は XML ドキュメントでは許可されていませんが、HTML ドキュメントでは許可されており、Salesforce データにも含まれている場合があります。無効な文字は、すべての API レスポンスから除外されます。
無効な文字:
- 0xFFFE
- 0xFFFF
- 制御文字 0x0 から 0x19。ただし、有効な次の文字を除く。0x9、0xA、0xD、タブ、改行、キャリッジリターン。
- 0xD800 - 0xDFFF、サロゲートペアを形成するために使用されている場合を除く
.NET、非文字列項目、および Enterprise WSDL
.NET と Enterprise WSDL を共に使用した場合、.NET は各非文字列項目に Boolean 型の項目を生成します。たとえば、MyDateField__c に日付値がある場合、.NET は MyDateField__cSpecified と呼ばれる Boolean 型の項目を生成します。
生成される項目値は、デフォルトでは false です。指定された項目値が false である場合、対応する元の項目の値は SOAP メッセージには含まれません。たとえば、通貨項目 annualRevenue の値をクライアントアプリケーションが生成した SOAP メッセージに含める前に、annualRevenueSpecified の値を true に設定する必要があります。
1account.annualRevenue = 10000;
2account.annualRevenueSpecified = true;