RESTful API를 공부하기 전에..
URI, URL의 개념에 대해 알아보고 HTTP method 들의 특징을 알아보자.
네트워크 상에서 리소스의 위치(경로)를 나타낸다. -> 위치를 알려줌
웹 사이트의 주소 뿐만 아니라 컴퓨터 네트워크 상의 자원을 모두 나타낼 수 있다.
네트워크 상에서 리소스 자체를 나타내는 구분자(식별자) -> 콕 집어서 알려줌
URI는 URL과 URN을 고려해 설계된 상위 개념이다.
URI 안에 URL과 URN이 포함되어있는 개념이다.
hierarchical part
┌───────────────────┴────────────────────┐
authority path
┌───────────────┴──────────────┐┌───┴────┐
abc://username:password@example.com:123/path/data?key=value#fragid1
└┬┘ └───────┬───────┘└────┬─────┘└─┬┘ └───┬────┘└───┬──┘
scheme user information host port query fragment
urn:example:mammal:monotreme:echidna
└┬┘ └──────────────┬───────────────┘
scheme path
GET
: URI 에 해당하는 정보의 전송요청을 보냄
POST
: 서버가 처리할 수 있는 자료를 보냄
PUT
: 자료를 전송하여 해당 URI 에 자료를 저장
DELETE
: 해당 URI 의 자원/정보를 삭제
PATCH
: 자원의 부분 교체
HEAD
: URI 에 해당하는 정보의 전송을 요청. GET 과는 다르게 Meta 정보만을 요청
OPTIONS
: 요청한 URI 에 어떤 메소드가 가능한지 질문
TRACE:
이전까지 요청한 정보들의 목록을 요청
CONNECT
: 프록시가 사용하고, 연결을 요청
- Restful API는 주로 데이터의 CRUD 를 위해 사용하며,
Create(생성) 에는 POST 메소드를,
Retrieve(읽기) 에는 GET 메소드를,
Update(수정) 에는 PUT 메소드를,
Delete(삭제) 에는 DELETE 메소드를 이용합니다.
idempotent
를 한글로 직역하면 "멱등의"이다.
f(x) = f(f(x))
처럼 몇 번이고 같은 연산을 반복해도 같은 값이 나온다는 뜻이다.
-> fault-tolerant API를 디자인 하는데 있어서 굉장히 중요한 요소라고 한다.
예를 들어 클라이언트가 POST
로 /dogs
를 요청했는데, 어떤 이유로간에 요청이 time-out (408) 되었다고 해 보자.
클라이언트는 요청이 전달되었는데 네트워크가 끊어졌는지, 아니면 요청조차 전달이 되지 않았는지 알 수 없다.
-> 이 때, 클라이언트가 원하는 operation 이 idempotent
하다면 다시 요청해도 상관없다. 항상 같은 결과를 만드니까. 그러나 POST
는 idempotent 하지 않다.
/dogs
에 POST 요청을 보내면 매번 다른 곳에 리소스가 생성된다.POST /dogs HTTP/1.1
{ "name": "blue", "age": 5 }
HTTP/1.1 201 Created
# dogs/1, dogs/2, dogs/3 ... DB에 계속 추가될 수 있다.
/dogs/3
에 PUT 요청을 보내면 리소스 지정이 명확해서 매번 같은 결과를 보장한다. → idempotent하다.
리소스의 위치를 지정해서 생성 혹은 업데이트(replace) 할 수 있다.
PUT은 리소스의 모든 프로퍼티를 업데이트한다.
PUT /dogs/3 HTTP/1.1
{ "name": "blue", "age": 5 }
# dogs/3, dogs/3, dogs/3 ...
리소스를 수정하지 않는 idempotent한 메소드를 safe하다고 말할 수 있다
하지만, DELETE
는 리소스를 변경하므로 예외이다.
GET
, PUT
: idempotent
HEAD
: body없이 Header의 meta 정보만 얻는다.
OPTIONS
: 해당 리소스에 가능한 operation이 무엇인지 얻는다.
( 참고: 리소스의 정보를 가져오는 것은 아니라서 캐싱이 안된다고한다.)
TRACE
는 클라이언트가 방금 보낸 요청을 다시 달라고 서버에 요청하는 것
CONNECT
는 HTTP 터널링을 할 때 쓰인다. 중간의 프록시 서버를 위해서 쓴다.
참조목록