REST - What is REST (2)

REST 2016.08.22 16:58

REST

What is REST? — (2)

<PREV 

 



REST 6 Constraints

Uniform Interface

Uniform Interface Constraints는 REST Design에서 가장 기본적인 Contraint이다.
이는 개발하고자하는 Architecture를 간단히 하고 Client와 Server를 분리하여 각각 독립적으로 진화하여 전개될 수 있게 한다.

즉, 통일된 Interface를 통해, 어떠한 기술(Phython, PHP, C#, Ruby, Java)이든 어떠한 Platform(iOS, Android, Mac, Windows)이든 상관없이 사용할 수 있다.





Uniform Interface는 크게 4가지로 설명되어질 수 있다.

  • Resource Indentifier
  • Resource Representations
  • Self-Descriptive Message
  • HASTOEAS (Hypermedia AS The Engine Of Application State)
- Resource Identifier (URI)

일반적으로 Resource는 Service나 Information을 제공하는 모든 것들(ex - Order, Invoice, Set of rows in a DB, Collectin of seach results, etc.)이 될 수 있으며, WEB 상에서 Addressable(=Client와 Server 사이에서 접근될 수 있고 전송될 수 있는)해야 한다.
즉, Resource는 하나 이상의 유일한 특정 주소인 URI(Uniform Resource Indentifer)를 반드시 가져야 한다. REST에서는 Resource를 특징짓을 수 있는 동사형(Verb)이 아닌 명사형(Noun) Indentifier로 URI를 정의하도록 권장하고 있으며, WEB 상에서 URL(Uniform Resource Locator)를 통해 제한된 Methord와 함께 접근될 수 있다.

Resources in REST

REST에서, Resources는 Entities(실체)와 유사하나, 어떤 결과물(result sets)은 아니다. REST에서 Resource는 두개의 주요 type으로 정의되기를 권장한다.

  • Collections : ex> users/
  • Itmes : ex> users/teddy
URL vs URI

URL은 URI의 한 부분으로 Network Lacation에 대한 정보 즉 Resouce에 대해 어떻게 접근하는지에 대한 Path이다.
URI는 Clients와 Servers를 간 Resource의 Representation을 교환하기 위한 유일한 방법으로, 시간이 흘러도 변하지않는 주소 정보를 포함한 Identifier이다.





- Resource Representation

Client-Server 구조에서 Resouce를 직접 주고 받는 것이 아니라, 그 Resource에 대한 상태나 정보를 설명(대표)하는 Representation을 주고 받는다. Resource는 하나 이상의 Representation을 가질 수 있으며, 해당 Representation의 형태는 content-type으로 결정되며, Client 마다 동일한 Resouce에 대해 다른 Representation을 가질 수 있다.

  • Representation Formats
    • text/html
    • application/xml
    • application/json
    • application/x-www-form-urlencoded (for input: PUT,POST)
    • Others : image(svg,jpg,png,etc.), txt/css, text/javascript




Resource는 Unique Id로 하나 이상의 URI 뿐만 아니라, 다양한 방법으로 설명(대표)되는 Representation을 가질 수 있다. 또한 Representation에 대한 접근을 위한 URL을 가지고, HTTP 4 가지 Method (POST/GET/PUT/DELETE)을 통해 생성, 조희, 갱신, 삭제될 수 있다.





- Self-Descriptive message & API

REST는 State를 유지하지 않는 특징을 가지고 있으므로, Client-Server 간 Message는 충분히 자신에 대한 State나 정보등을 설명할 필요가 있다. 이를 위해서 REST Message는 요청 작업을 완료할 수 있도록 또는, 그 Resonpse를 이해할 수 있도록 충분한 정보들을 HTTP method, HTTP status code, HTTP Header등을 활용하여 전달하거나 전달되어야 한다.

또 다른 관점으로는, Server가 제공하는 REST API는 그 스스로가 무엇을 하는 것인지 별다른 문서없이 충분히 설명되어야져 한다는 것이다.

REST API는 URI와 HTTP method와 함께 Resource를 Collection & Item으로 계층적으로 표현함으로써 어떠한 기능을 수행하고 어떠한 결과(HTTP Status Code)를 내는지 쉽게 파악할 수 있도록 구성하여야 한다.

Resource GET PUT POST DELECT
http://example.com/resoources/ Collection에 속한 자원들의 목록 조회 다른 Collection으로 교체 해당 Collection을 생성 전체 Collection을 삭제
http://example.com/resources/item17/ item17에 대한 자원 조회 item17 수정 item17에 귀속된 새로운 자원 생성 item17 삭제
HTTP Status Code Descriptions
200 성공
400 Bad Request - field validation 실패시
401 Unauthorized - API 인증,인가 실패
404 Not found
500 Internal Server Error - 서버 에러

REST API Design Guide refer to as below
http://bcho.tistory.com/914

- HASTOEAS

Hypermedia As The Engine Of Application State

  • Use links to allow client to discover locations and operations
  • Link relations are used to express options
  • Clients do not need to knows URLs
  • This controls the state

HATEOAS 메시지를 보내는 것은 어플리케이션의 상태를 변화시킨다.
하이퍼미디어의 특징을 이용하여 HTTP Response에 다음 Action이나 관계되는 리소스에 대한 HTTP Link를 함께 리턴하는 것이다.
예를 들어 앞서 설명한 페이징 처리의 경우, 리턴시, 전후페이지에 대한 링크를 제공한다거나,연관된 리소스에 대한 디테일한 링크를 표시 하는 것등에 이용할 수 있다.

조회 예제
{  
    users : 
    [  
        {  
            "id":"user1",
            "name":"terry"
        },
        { 
            "id":"user2",
            "name":"carry"
        }
    ],
    "links":
    [  
        {
            "rel":"pre_page",
            "href":"http://xxx/users?offset=6&limit=5"
        },
        {
            "rel":"next_page",
            "href":"http://xxx/users?offset=11&limit=5"
        }
    ]
}

관계 표현 예제
{  
    "id":"terry",
    "links":
    [  
        {  
        "rel":"friends",
        "href":"http://xxx/users/terry/friends"
        }
    ]
}
블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자