POST는 서버에 데이터를 제출해 새 리소스를 만들거나 어떤 처리를 실행할 때 씁니다. 서버 상태를 바꾸므로 안전하지 않고(non-safe), 두 번 보내면 리소스가 두 개 생길 수 있어 멱등하지 않습니다(non-idempotent).
요청 본문에 담는 데이터의 형식은 `Content-Type` 헤더로 알립니다(`application/json`, `application/x-www-form-urlencoded`, `multipart/form-data` 등). 새 리소스를 만들면 201 Created와 함께 `Location` 헤더로 새 URL을 알려주는 것이 표준입니다.
POST는 멱등하지 않으므로 결제·주문 같은 동작에서 네트워크 재시도로 중복 생성이 일어날 수 있습니다. 이를 막으려면 클라이언트가 고유 키를 보내고 서버가 중복을 거르는 멱등 키(idempotency key) 패턴을 씁니다. 검증 실패는 422, 상태 충돌은 409로 응답합니다.
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
{ "name": "Ada" }HTTP/1.1 201 Created
Location: /api/users/42
Content-Type: application/json
{ "id": 42, "name": "Ada" }curl -X POST https://api.example.com/api/users \
-H 'Content-Type: application/json' \
-d '{"name":"Ada"}'await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Ada' })
});@app.post('/api/users')
def create_user():
data = request.get_json()
uid = db.insert(data)
return jsonify(id=uid, **data), 201