HTTP Methods는 총 8개로 클라이언트가 서버에게 정보를 전달하거나 요청하는 등 다양한 역할을 수행하는 동사나 명사를 나타낸다.
GET
, POST
, PUT
, DELETE
, PATCH
, CONNECT
, OPTIONS
, TRACE
, HEAD
등이 존재하는데 잘 안쓰이는 것을 제외하곤 자주 쓰이는 요청 메스드를 알아보자.
RESTful API를 작성할때 대표적인 CRUD, 자주사용되는 메소드는 아래와 같다.
GET
, POST
, PUT
, DELETE
, PATCH
POST와 PUT은 비슷하지만 멱등성(Idempotence)
라는 개념을 알아야 구분이 가능하다.
멱등성
멱등법칙(冪等法則) 또는 멱등성(冪等性, 영어: idempotent)은 수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다.
여러번 요청, 작업을 수행해도 결과가 같음을 뜻하는데, 동일한 요청을 여러번 보내도 결과 PUT
은 동일한 결과값을 유지하는 반면 POST
는 보낸 요청에 따라 리소스가 생성이 된다.
GET은 Requset_URI에 붙여 서버에게 받고자 하는 정보를 요청한다.
예를들면 즐겨찾기에 추가된 구글 페이지를 요청해온다고 치자.
Query_Strings Parameters
https://www.google.co.kr/?gfe_rd=cr&ei=9uv5WKC5IrTf8AfQmJ3QCA
주소를 보면 ?
으로 url
의 끝임을 알리고 요청할 데이터의 표현을 보여준다.
여기서 보면 key
와 value
로 나타나있는데,
key
: gfe_rd
, ei
value
: cr
, 9uv5WKC5IrTf8AfQmJ3QCA
&
으로 표현한다.GET
메소드는 URL에 특정 리소스를 붙여서 정보를 요청하는 메소드이며, 용량에 한계가 있기때문에 GET
요청시 Request Body
에 담아서 보내지 않는다. (가능은 하나 이렇게 쓰라고 만든 메소드가아님.)
리소스 찾을 시
: 200 (OK)
리소스 찾을 수 없을 시
: 404 (Not Found)
GET 요청이 올바르게 구성되어있지 않을 시
: 400 (Bad Request)
POST
는 주로 새로운 리소스를 생성 하기위해 서버에 데이터를 보낼 때 사용한다. GET
과는 다르게 URL
로 보내지 않고 Reqeust body
에 담아서 보낸다.
여기서 body
에 담긴 내용물이 어떤 타입인지 보내야할때, 헤더에 다음과 같은 내용을 담는다.
Content-type에는 수많은 타입이 존재하지만 대표적인 것으로는 다음과같다.
//text
Content-Type: text/plain
Content-Type: text/css
Content-Type: text/html
//application
Content-Type: Application/json
Content-Type: Application/x-www-form-urlencode
Content-Type: multipart/formed-data //주로 파일 전송에 씀
바디에는 주로 서버에 전달하기에 비교적 가벼운 JSON
을 담아 전달한다.
POST /auth/login HTTP/1.1
/* 생략 */
Content-Type: application/json
{
"email": "json@gmail.com"
"password": "votmdnjem12"
}
전송 했지만 생성됬거나 안됬을때
: 200 (OK)
전송 성공 후 자원이 생성됬을 경우
: 201 (Created)
전송은 했지만 전송할 데이터가 없는 경우
: 204 (No Content)
POST 요청이 올바르게 구성되어있지 않을 시
: 400 (Bad Request)
전송했지만 리소스의 현재 상태와 충돌 시
: 409 (Conflict)
PUT
은 POST
와 유사하지만 CRUD
에서 U: Update
에 속한다. PUT
은 멱등적인 메소드인데, 새로운 리소스를 생성하거나, 대상 리소스가 존재한다면 데이터를 대체한다.
그렇기 때문에 정보를 변경하는데 주로 쓰이는 메소드이다.
예를들면
원본데이터
{
"username" : "kimcoding",
"email" : "kimcoding@gmail.com"
}
리소스의 일부를 수정하기 위해선 모든 필드를 가져와야한다.
PUT /auth/user/2 HTTP/1.1
/* 생략 */
{
"email" : "abc@naver.com"
}
만약 특정 리소스를 수정한다고 가정해보면 응답은 아래와같다.
{
"name": null,
"email" : "abc@naver.com"
}
기존 리소스가 수정된 경우
: 200 (OK)
전송 성공 후 자원이 생성됬을 경우
: 201 (Created)
전송은 했지만 전송할 데이터가 없는 경우
: 204 (No Content)
PATCH
메소드도 CRUD
의 U: Update
에 속하며, PUT
과 유사하지만 멱등성을 가지지 않아 동일한 요청에 다른 결과를 야기할 수 있다.
PATCH
는 PUT
과는 다르게 자원의 부분을 교체한다. 즉, 모든 필드를 불러오지 않아도 일부분의 필드만 작성하여 부분 교체가 가능하다.
예를들면
원본데이터
{
"username" : "kimcoding",
"email" : "kimcoding@gmail.com"
}
리소스의 일부분 중email
을 수정해보자
PUT /auth/user/23 HTTP/1.1
/* 생략 */
{
"email" : "job@gmail.com"
}
결과는 다음과 같다.
{
"username" : "kimcoding",
"email" : "job@gmail.com"
}
성공적으로 리소스를 수정한 경우
: 200 (OK)
작업은 했으나
DELETE 메소드는 지정된 리소스를 서버에 삭제해달라고 요청하는 메소드이다. 또한 멱등성을 띄고 있다.
예시로 들면 다음과같다.
DELETE /auth/user/3
혹은
DELETE /auth/user/123/accounts/45
해당 리소스가 삭제된 경우
: 200 (OK)
작업이 대기열에 있는경우
: 202 (Accepted)
전송은 했지만 전송할 데이터가 없는 경우
: 204 (No Content)