클라이언트가 웹 서버에게 요청하는 목적 및 그 종류를 알리는 수단으로 사용하는 HTTP 메서드 5가지에 대해 정리한 포스팅 입니다.
HTTP 주요 메서드 5가지에 대해 다룹니다.
(그 외 HEAD, OPTIONS, TRACE, CONNECT 가 있습니다.)
이 글의 예제는 https://jsonplaceholder.typicode.com/ 사이트를 활용하여 Postman으로 실습한 결과 입니다. JSONPlaceholder 사이트에서는 posts 리소스에 대해 POST, PUT, PATCH, DELETE 명령을 수행해볼 수 있습니다. (실제로 서버에 업데이트 되는 것은 아니지만, 반영되는 것처럼 속여 응답한다고 사이트에 적혀있습니다.)
GET은 서버로부터 리소스를 조회하기 위해 설계된 메서드입니다. GET은 요청을 전송할 때, 필요한 데이터를 Body에 담지 않고, URL에 쿼리스트링을 붙여 전송합니다.
주로 정적 데이터를 조회하거나, 동적 데이터를 필터링&정렬할 시 사용합니다.
username이 Samantha이고, city가 McKenziehaven인 사용자를 조회합니다.
GET https://jsonplaceholder.typicode.com/users?username=Samantha&city=McKenziehaven
해당 사용자의 상세 정보를 확인할 수 있습니다.
[
{
"id": 3,
"name": "Clementine Bauch",
"username": "Samantha",
"email": "Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite 847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"geo": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
"phone": "1-463-123-4447",
"website": "ramiro.info",
"company": {
"name": "Romaguera-Jacobson",
"catchPhrase": "Face to face bifurcated interface",
"bs": "e-enable strategic applications"
}
}
]
POST는 리소스를 생성, 변경 하기 위해 설계된 메서드입니다. GET과 달리 전송해야될 데이터를 HTTP 메세지의 Body에 담아 전송합니다.
HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있기 때문에 대용량 데이터 전송이 가능합니다.
예시로 사용할 JSONPlaceholder 사이트에서 posts 리소스 API 형태는 아래와 같이 userId, id, title, body로 이루어져 있습니다.
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
id는 포스트 업데이트 시, 자동으로 붙는 번호입니다.
그러므로 POST 요청으로 새로운 포스트 작성 시, userId, title, body로 이루어진 raw JSON data Body로 요청해야합니다.
POST https://jsonplaceholder.typicode.com/posts
요청 메시지 본문
{
"title": "Simple Post",
"body": "Shala Shala",
"userId": 7
}
기존 post가 100개로, 101번째 포스트가 생성되어 응답이 내려오는 것을 확인할 수 있습니다.
{
"title": "Simple Post",
"body": "Shala Shala",
"userId": 7,
"id": 101
}
간단히 정리하자면, GET은 서버의 데이터를 조회하기 위해, POST는 서버의 값이나 상태를 바꾸기 위해 사용합니다.
PUT은 리소스를 업데이트하거나 리소스가 없다면 새로운 리소스를 생성하기 위해 설계된 메서드입니다. PUT은 부분 수정하는 PATCH와 달리, 항상 모든 필드값을 가져와서 모든 필드를 항상 새로운 값으로 교체합니다.
id가 1인 포스트의 title, body, userId를 모두 수정합니다.
PUT/PATCH 요청의 경우, 수정할 리소스의 주소를 명확히 입력해야합니다.
PUT https://jsonplaceholder.typicode.com/posts/1
요청 메시지 본문
{
"id": 1,
"title": "First Post",
"body": "Shala Shala~",
"userId": 3
}
id가 1인 포스트에서 수정한 내용으로 응답이 내려오는 것을 확인할 수 있습니다.
{
"id": 1,
"title": "First Post",
"body": "Shala Shala~",
"userId": 3
}
PATCH는 리소스를 업데이트 하기 위해 설계된 메서드입니다.
PUT과 달리 부분 데이터를 업데이트합니다.
id가 1인 포스트의 body만 수정해보았습니다.
PATCH https://jsonplaceholder.typicode.com/posts/1
{
"body": "Shala~ Shala~"
}
기존 id가 1인 포스트에서 body만 바뀐 응답을 확인할 수 있습니다.
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "Shala~ Shala~"
}
DELETE는 리소스를 삭제하기 위해 설계된 메서드입니다.
id가 1인 포스트를 삭제합니다.
DELETE https://jsonplaceholder.typicode.com/posts/1
빈 응답이 내려오는 것을 확인할 수 있습니다.
{}
'안전하다'는 것은 해당 HTTP 메서드를 호출했을 시 리소스가 변경되지 않는다는 것을 의미합니다.
POST, PUT, PATCH, DELETE 요청의 경우 리소스를 변경/삭제하기 때문에
주요 메서드 5가지 중에서는 GET 요청만 안전하다고 볼 수 있습니다.
'멱등성을 가진다'는 것은 해당 HTTP 메서드를 1회 호출하나, 100회 호출하나 동일한 결과를 나온다는 것을 의미합니다.
POST 요청의 경우, 호출할 때마다 새로운 리소스를 생성하기 때문에 멱등하지 않습니다.
PATCH 요청의 경우, 부분 데이터를 업데이트하기 때문에 이전 값을 활용하여 값을 업데이트한다면 멱등하지 않을 수도 있습니다.(참고)
고로, 주요 메서드 5가지 중에서는 POST/PATCH 요청만 멱등하지 않다고 볼 수 있습니다.
'캐시 가능하다'는 것은 해당 HTTP 메서드 응답 결과를 캐시할 수 있다는 것을 의미합니다.
주요 메서드 5가지 중에서는 GET/POST/PATCH 요청만 캐시 가능합니다.
하지만, POST/PATCH 요청의 경우, 본문 내용까지 캐시 키로 고려를 해야하는데, 구현이 어려워 실제로는 캐시로 잘 사용하지 않는다고 합니다.
HTTP 메서드 | CRUD 역할 | 요청 메시지 Body | 응답 메시지 Body | 안전 | 멱등 | 캐시가능 |
---|---|---|---|---|---|---|
GET | Read | N | Y | Y | Y | Y |
POST | Create | Y | Y | N | N | Y |
PUT | Create/Update | Y | Y | N | Y | N |
PATCH | Update | Y | Y | N | N | Y |
DELETE | Delete | N | Y | N | Y | N |
requests는 Python으로 HTTP 통신이 필요한 프로그램을 작성할 때, 가장 많이 사용되는 라이브러리로, 별도로 패키지를 설치해야 합니다.
$ pip install requests
위에서 Postman으로 실습한 내역을 Python 코드로 실습하면 아래와 같습니다.
import requests
# GET 요청
response = requests.get(url="https://jsonplaceholder.typicode.com/users?username=Samantha&city=McKenziehaven")
# POST 요청
response = requests.post(url="https://jsonplaceholder.typicode.com/posts",
json={
"title": "Simple Post",
"body": "Shala Shala",
"userId": 7
})
# PUT 요청
response = requests.put(url="https://jsonplaceholder.typicode.com/posts/1",
json={
"id": 1,
"title": "First Post",
"body": "Shala Shala~",
"userId": 3
})
# PATCH 요청
response = requests.patch(url="https://jsonplaceholder.typicode.com/posts/1",
json={
"body": "Shala~ Shala~"
})
# DELETE 요청
response = requests.delete(url="https://jsonplaceholder.typicode.com/posts/1")
print문으로 response.json()
출력 시, Postman과 동일한 응답 결과를 확인할 수 있습니다.
https://jsonplaceholder.typicode.com/ 이외에 API 테스트를 위해 활용할 수 있는 REST API 사이트입니다.