Trailheadに基いて、Lightning プラットフォーム API及びApex インテグレーションサービスの整理

<B>APIについて、以下の２パターンがあります。
　　・外部システムからsalesforce組織内のデータを操作する
　　・salesforce組織内から外部システムのデータを操作する
上記２種類について、まとめました。
</B>
*****
#### 外部システムからsalesforceのデータをCRUDする場合、以下のAPIを利用する
　<B>REST API</B>
　　・XML と JSON の両方がサポート
　　・軽量の要求/応答フレームワーク
　　・ワークベンチを利用して、検証できる
　　・GET、POST、PUT、PATCH、DELETE
　　・プラットフォーム提供、コーディング不要
　<B>SOAP API</B>
　　・WSDLファイルを使用
　　・XML のみがサポート
　　・パスワードの管理や検索の実行などの多くの機能を実行できる
　　・プラットフォーム提供、コーディング不要
　<B>BULK API</B>
　　・大量データの一括読み込みまたはクエリに特化した RESTful、API
　　・非同期
　　・プラットフォーム提供、コーディング不要
　<B>Streaming API</B>
　　・データが変更されたらトリガされる通知の設定に特化した API
　　・publish-subscribe (pub/sub) モデル
　　・リアルタイムのデータストリームを受信
　<B>Apex REST API（Apex WEBサービス）</B>
　　・Apex クラスと Apex メソッドを公開
　　・ロジックカスタマイズできる
　　・@HttpGet、@HttpPost、@HttpDelete、@HttpPut、@HttpPatch
　　・テスト方法：RestRequestを作成
　　・エンドポイント：（下記のApex_REST_APIの実装例の場合）
　　　　https://yourInstance.salesforce.com/services/apexrest/Account/
　　・ワークベンチを利用して、検証できる
　　・cURL を使用したデータの取得（認証：セッションID）
　<B>Apex SOAP API（Apex WEBサービス）</B>
　　・Apex クラスと Apex メソッドを公開
　　・ロジックカスタマイズできる
★API アクセスと認証：①OAuth フロー
　　　　　　　　　　　②SOAP API login() コールから取得したセッション ID
*****
#### salesforceから外部システムのデータを操作する場合、以下を利用する
　<B>Apex REST コールアウト</B>
　　・GET、POST、PUT、DELETE
　　・エンドポイントアドレスの承認（リモートサイトの設定登録）
　　・テスト方法：StaticResourceCalloutMock／HttpCalloutMock
　　・トリガおよび非同期 Apex でのコールアウトの使用時、@future(callout=true) アノテーションが付加された非同期メソッドにコールアウトコードを配置する
　<B>Apex SOAP コールアウト</B>
　　・WSDL2Apexを使用しXMLファイルをApexコードに生成（Apexクラス⇨WSDLからの生成）
　　・エンドポイントアドレスの承認（リモートサイトの設定登録）
　　・テスト方法：WebServiceMock

*****
#### 以下は上記のAPIについての一部の使用例です。Trailheadの抜粋ですので、詳細は文章下部のリンクを参照

```Apex_REST_APIの実装例.cls
@RestResource(urlMapping='/Account/*')
global with sharing class MyRestResource {
    @HttpGet
    global static Account getRecord() {
        // Add your code
    }
}
```

```Apex_SOAP_APIの実装例.cls
global with sharing class MySOAPWebService {
    webservice static Account getRecord(String id) {
        // Add your code
    }
}
```

```curlの使用例.txt
// 組織をログインして、セッションIDを取得する
curl -v https://login.salesforce.com/services/oauth2/token -d "grant_type=password" -d "client_id=<your_consumer_key>" -d "client_secret=<your_consumer_secret>" -d "username=<your_username>" -d "password=<your_password_and_security_token>" -H 'X-PrettyPrint:1'

// セッションID（access_token）で認証して、データを取得する
curl https://yourInstance.salesforce.com/services/apexrest/Cases/<Record_ID> -H "Authorization: Bearer <your_session_id>" -H "X-PrettyPrint:1"
```

```Apex_REST_APIコールアウトの実装例.cls
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals');
request.setMethod('GET');
HttpResponse response = http.send(request);
// If the request is successful, parse the JSON response.
if (response.getStatusCode() == 200) {
    // Deserialize the JSON string into collections of primitive data types.
    Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
    // Cast the values in the 'animals' key as a list
    List<Object> animals = (List<Object>) results.get('animals');
    System.debug('Received the following animals:');
    for (Object animal: animals) {
        System.debug(animal);
    }
}
```

*****
#### 参照Trailhead
[Lightning プラットフォーム API の基礎](https://trailhead.salesforce.com/ja/content/learn/modules/api_basics)
[Apex インテグレーションサービス](https://trailhead.salesforce.com/ja/content/learn/modules/apex_integration_services)