REST API


REST
Representation State Transfer(REST):転送リソースステータス
ネットワークアーキテクチャの原則
リソースを名前で区切ってステータスを交換
特長

  • クライアント、サーバ:クライアントとサーバは互いに独立している必要があります.

  • Stateless:クライアントの状態をサーバに保存せず、リクエストに応答します.

  • Cache:クライアントはサーバの応答(一時記憶)をキャッシュできる必要があります.

  • 階層化:サーバとクライアントの間、ファイアウォール、ゲートウェイ、Proxyなどの異なる階層が必要であり、拡張が必要です.

  • インタフェースの一貫性:インタフェースの一貫性を確保し、アーキテクチャを簡素化し、クライアントとサーバが独立して改善できるようにします.
  • 判定基準
    1.資源の識別
    http://localohost/user/100
    Resource : user
    識別子:100
    2.メッセージによるリソースの操作
    Webは様々な方法でデータを伝達することができる.
    ex) HTML, XML, JSON, TEXT...
    HTTPヘッダのデータ型を指定できます.
    リソースを処理するためにデータ全体を送信するのではなく、メッセージを転送します.
    3.自己叙述的な情報
    要求されたデータがどのように処理されるかを決定するために、十分なデータを含める必要があります.
    HTTPベースのRESTは、HTTPメソッド、Header情報、URIを含む情報として表すことができる.
    GET: https://foo.co.kr/user/100, 사용자의 정보 요청
    POST: https://foo.co.kr/user   , 사용자의 정보 생성
    PUT: https://foo.co.kr/user	   , 사용자 정보 생성 및 수정
    DELETE: https://foo.co.kr/user/100 사용자 정보 삭제
    4.ハイパーメディアをアプリケーション状態とするエンジン
    REST APIの開発に際しては、クライアント要求のデータのみに応答するのではなく、関連リソースのリンク情報も含めなければならない.
    これらの条件が備わっていればREST Fulとして表され、REST APIと呼ばれる.
    GET API
    使用方法
    @RestController
    @RequestMapping("/api/get")
    public class GetApiController {
    
        @GetMapping(path="/hello")      //http://localhost:8081/api/get/hello
        public String hello(){
            return "get Hello";
        }
    
        @RequestMapping(path = "/hi",method = RequestMethod.GET)
        public String hi(){
            return "hi";
        }
    }
    複数の方法でマッピングできます.
    @PathVariable
    // http://localhost:8081/api/get/path-variable/{name}
        // GetMapping 이름과 매개변수 이름 같아야 함 ->
        @GetMapping(path = "/path-variable/{name}")
        public String pathVariable(@PathVariable(name = "name") String pathName){
            System.out.println("path variable : " + pathName );
            return pathName;
        }
    urlには一定の値と可変の値があります.
    変更部分は{}で宣言します.
    http://localhost:8081/api/get/path-variable/{name}
    上のurlは,ユーザによってnameの値が変化する場合である.
    @PathValibaleをパラメータとして受信できます.
    宣言されたurlと同じ名前でパラメータ名を設定する必要があります.default nameをurlと同じ名前で宣言する場合は、他の名前のパラメータを使用できます.
    @PathVariable(name = "name")
    
    @RequestParam
    query-paramはurl中?key 1=value 1&key 2=value 2&key 3=value 3の形式で伝達されます.
    Map形式で
    //http://localhost:8081/api/get/query-param?user=steve&[email protected]&age=30
    
        @GetMapping(path = "/query-param")
        public String queryParam(@RequestParam Map<String,String> queryParam){
    
            StringBuilder sb = new StringBuilder();
            queryParam.entrySet().forEach( entry -> {
                System.out.println(entry.getKey());
                System.out.println(entry.getValue());
                System.out.println("\n");
    
                sb.append(entry.getKey()+" = "+entry.getValue() +"\n");
            });
    
            return sb.toString();
        }
    一般パラメータとして
        // 넘겨 받는 매개변수 제한 가능, 수정할 때, 귀찮음
        @GetMapping(path = "/query-param02")
        public String queryParam02(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam int age
        ){
    
            return name + " " + email + " " + age;
        }
    参照としてdtoクラスを作成する
    // 참조형 매개변수로 선언, 깔끔함. dto
        @GetMapping(path = "/query-param03")
        public String queryParam03(UserRequest userRequest){
    
            System.out.println(userRequest.getName());
            System.out.println(userRequest.getEmail());
            System.out.println(userRequest.getAge());
            return userRequest.toString();
        }
    DTO
    データ転送オブジェクト(DTO)は層間データ交換のためのオブジェクトであり、DTOは論理を持たない純粋なデータオブジェクト(getter&setterのクラスのみ)
    POST API
    使用方法
    
    @RestController
    @RequestMapping("/api")
    public class PostApiController {
    
        // post일 때는 RequestBody get일 때는 RequestParam
        @PostMapping("/post")
        public void post(@RequestBody Map<String,Object> requestData){
    
            requestData.forEach((key, value) -> {
                System.out.println("key : " + key);
                System.out.println("value : " + value);
            });
        }
    requestを受信するには@requestBodyが必要です.
    map形式でリクエストを受け入れれば、どんな代価を払っても得ることができるが、この点は不安だ.
    @PostMapping("/post02")
        public void post02(@RequestBody PostRequestDto requestData){
    
            System.out.println(requestData);
            System.out.println(requestData.toString());
        }
    dtoクラスの作成と受信は安全です
    PUT API
    使用方法
    @RestController
    @RequestMapping("/api")
    public class PutApiController {
    
        @PutMapping("/put/{userId}")
        public PostRequestDto put(@RequestBody PostRequestDto requestData, @PathVariable(name = "userId") Long id){
            System.out.println(requestData);
            System.out.println(id);
            return requestData;
        }
    }
    Postのようにリクエストを受信するにはRequestBodyコメントが必要です.
    DELETE API
    使用方法
    @RestController
    @RequestMapping("/api")
    public class DeleteApiController {
    
        @DeleteMapping("/delete/{userId}")
        public void delete(@PathVariable(name = "userId") Long id,@RequestParam String account){
    
            System.out.println("id : " + id + " account : " + account);
    
        }
    }