Menu

JSON REST 인터페이스 (JSON REST Interface)

vibe.d 프레임워크를 이용해 JSON 형태의 응답을 제공하는 웹 서비스를 단시간에 만들 수 있습니다.

만약 /api/v1/chapters 경로로 HTTP 요청이 들어왔을 때 아래처럼 응답을 주고 싶다고 가정해봅시다.

    [
      {
        "title": "안녕",
        "id": 1,
        "sections": [
          {
            "title": "세상",
            "id": 1
          }
        ]
      },
      {
        "title": "고급과정",
        "id": 2,
        "sections": []
      }
    ]

먼저 해야할 일은 일대일 로 구조가 정확히 대응되는 D 언어 struct 자료 구조와 REST API에 필요한 함수가 정의된 인터페이스를 만드는 것입니다.

    interface IRest
    {
        struct Section {
            string title;
            int id;
        }
        struct Chapter {
            string title;
            int id;
            Section[] sections;
        }
        @path("/api/v1/chapters")
        Chapter[] getChapters();
    }

interface 는 바로 이용할 수 있는 형태가 아니라, 구현이 필요합니다. 실질적 구현을 위해서, IRest 를 상속 받아 나머지 코드를 채웁니다.

    class Rest: IRest {
        Chapter[] getChapters() {
          // 코드를 채워넣어야합니다
        }
    }

이제 구현이 완료된 class 로부터 객체를 만들어, URLRouter 에 REST 인터페이스 구현체로써 등록해주면 모든 게 완료됩니다!

    auto router = new URLRouter;
    router.registerRestInterface(new Rest);

vibe.d가 가지고 있는 REST 인터페이스 생성기 는 POST 요청으로 전달받은 JSON 데이터로부터, 내부 함수의 각 입력값에 대응하는 값을 자동으로 추출해낼 수도 있습니다.

REST 서버를 만들 때 사용했던 인터페이스(여기서는 IRest 가 해당됩니다)는 역으로, REST API에 연결하기 위한 클라이언트를 만들 때 쓰이는 것도 가능합니다. 별도의 모듈이나 변환 과정이 필요하지 않으며, 서버 쪽과 같은 인터페이스를 공유합니다.

    auto api = new RestInterfaceClient!IRest("http://127.0.0.1:8080/");
    // HTTP GET 요청을 /api/v1/chapters 경로로 보내고, 응답값에서 필요한 값을 추출하고,
    // IRest 인터페이스에 정의해둔 Chapter라는 struct 타입의 값으로 변환합니다.
    auto chapters = api.getChapters();

rdmd playground.d