salseforceのRestAPI作成


## APIとは？
APIとは、Application Programming Interfaceの略である。
APIの機能（役割）：システムとシステムをつなげる機能。
APIの基本構成：リクエスト&レスポンスでできている。
#### APIの基本動作：
他のシステムへ情報を依頼（リクエスト）
↓↑
他のシステムは情報を依頼主に返す（レスポンス）

#### APIのイメージ図
WEB APIの具体的な流れイメージをしましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/9d1884b5-22ee-e899-4374-d0bf1f70a92d.png)
## リクエストとは、サイトへアクセスすること
APIのリクエストとは、他のシステムへ情報を要求することである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/95058c27-05da-b1a2-289b-9ced7c29b0d7.png)
## レスポンスとは、サイトから情報を返すこと
APIのレスポンスとは、他のシステムから返ってきた情報である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/003e341f-196b-0831-850b-15f35ea2bd7f.png)

## RESTとはREpresentational State Transferの略である
読み方は『レスト』である。

下記のルールに従って作成したAPIのことをREST APIということになる。
①アドレス可能性：URIではリソースの指定を行う。
②統一インターフェース：HTTPメソッド（POST、PUT、GET、DELETE）で追加、更新、取得、削除を設計する。
③ステートレス性：ステートレスであること（セッションといった状態管理をしない）(やり取りされる情報はそれ自体で完結して解釈することができる)
④接続性：HTML、XMLなどのハイパーメディアの使用すること（ハイパーリンクが使用できる）

## RestAPIメモ
### RestAPIUndelete(Apex) 
```Apex:(RestAPIUndelete)
@RestResource(urlMapping='/Undelete/*')
global with sharing class RestAPIUndelete {
    global class MyException extends Exception {}
    
    /** カスタムExceptionフラグ */
    global static Boolean isExceptionFlg = false;

    @HttpPost
    global static void getRestAPIUndelete() {
        
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;

        // requestBody文字列から改行を取り除く
        String requestBodyStr = req.requestBody.ToString().replaceAll('\r\n|\n| ', '');
        // requestBody文字列から文字列【"id"】,【:】,【["】,【"]】,【{}】を取り除く
        requestBodyStr = requestBodyStr.replaceAll('"id"|\\:|\\["|"\\]|\\{|\\}', '');
        // requestBodyStr文字列【","】で分割する
        List<String> requestBodyStrList = requestBodyStr.split('","');

        String responseResult = '';
        List<ResultData> resultDataList = new List<ResultData>(); 

        try {
            if(isExceptionFlg) {
                throw new MyException();
            }
            // Undelete処理
            List<Database.UndeleteResult> UndeleteResultList = Database.undelete(requestBodyStrList,false);

            for(Database.UndeleteResult UndeleteResult : UndeleteResultList){
                // Undelete成功の場合
                if(UndeleteResult.isSuccess()){
                    ResultData resultData = new ResultData();
                    resultData.id = UndeleteResult.getId();
                    resultData.success = UndeleteResult.isSuccess();
                    resultDataList.add(resultData);
                }else {
                    ResultData resultData = new ResultData();
                    resultData.id = UndeleteResult.getId();
                    resultData.success = UndeleteResult.isSuccess();
                    resultData.errorMessage = UndeleteResult.getErrors().get(0).getMessage();
                    resultDataList.add(resultData);
                }
            }
            // APIレスポンス
            res.addHeader('Content-Type', 'application/json');
            res.statusCode = 200;
            responseResult = JSON.serialize(resultDataList);
            res.responseBody = Blob.valueOf(responseResult);
            return;
        } 
        catch (Exception e) {
            ResultData resultData = new ResultData();
            resultData.success = false;
            resultData.errorMessage = e.getMessage();
            res.addHeader('Content-Type', 'application/json');
            res.statusCode = 500;
            responseResult = JSON.serialize(resultData);
            res.responseBody = Blob.valueOf(responseResult);
            return;
        }
    }
    global class ResultData{
        global Id id;
        global Boolean success;
        global String errorMessage;
    }
}
```
### Test_RestAPIUndelete (Apex) 
```Apex:(Test_RestAPIUndelete )
@isTest
public with sharing class Test_RestAPIUndelete {
    @testSetup
    static void setup() {
        // 各テストメソッドで使用できるテストデータを作成する
        List<Account> accList = new List<Account>();
        Account acc1 = new Account();
        acc1.Name ='test001';
        Account acc2 = new Account();
        acc2.Name ='test002';
        accList.add(acc1);
        accList.add(acc2);
        insert accList;
    }
    @isTest 
    static void RestAPIUndelete_test001() {
        Account acc1=[select Id,name from Account where name='test001'];
        Account acc2 =[select Id,name from Account where name='test002'];

        String json_str = '{"id": ["' + acc1.Id +'","' + acc2.Id +'"]}';
      
        RestRequest req = new RestRequest();
        req.requestBody = Blob.valueof(json_str);
        RestContext.request = req;
        RestResponse res = new RestResponse();
        RestContext.response = res;
        
        RestAPIUndelete.getRestAPIUndelete(); //実行
        
        System.assertEquals(res.statusCode, 200); //ステータスコード
    }
    @isTest 
    static void RestAPIUndelete_test002() {
        Account acc1=[select Id,name from Account where name='test001'];
        Account acc2 =[select Id,name from Account where name='test002'];
        List<Account> accList = new List<Account>();
        accList.add(acc1);
        accList.add(acc2);
        delete accList;

        String json_str = '{"id": ["' + acc1.Id +'","' + acc2.Id +'"]}';

        RestRequest req = new RestRequest();
        req.requestBody = Blob.valueof(json_str);
        RestContext.request = req;
        RestResponse res = new RestResponse();
        RestContext.response = res;
        
        RestAPIUndelete.getRestAPIUndelete(); //実行
        
        System.assertEquals(res.statusCode, 200); //ステータスコード
    }
    @isTest 
    static void RestAPIUndelete_test003() {

        Account acc1=[select Id,name from Account where name='test001'];
        Account acc2 =[select Id,name from Account where name='test002'];
        List<Account> accList = new List<Account>();

        String json_str = '{"id": ["' + acc1.Id +'","' + acc2.Id +'"]}';
      
        RestRequest req = new RestRequest();
        req.requestBody = Blob.valueof(json_str);
        RestContext.request = req;
        RestResponse res = new RestResponse();
        RestContext.response = res;

        RestAPIUndelete.isExceptionFlg =true;
        RestAPIUndelete.getRestAPIUndelete(); //実行
        
        System.assertEquals(res.statusCode, 500); //ステータスコード
    }
}