[Django]API POST, PUT, DELETE

Hyeo_Ni__·2024년 1월 9일
0

Django

목록 보기
7/12
post-thumbnail

📚 POST

데이터 입력시 POST를 사용한다.

✍ 코드

# api/views.py
from rest_framework import status

@api_view(['POST'])
def postTestAPI(request):
    serializer = TestAPISerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    
# api/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('getapi/', views.getTestAPI),
    path('postapi/', views.postTestAPI) # 추가
]

코드설명
@api_view(['POST'])API 뷰를 정의, HTTP 중 POST 요청을 처리한다.
TestAPISerializer(data=request.data)받아온 데이터(request.data)를 TestAPISerializer를 사용하여 직렬화
serializer.is_valid()렬화된 데이터가 유효한지 확인
Response상태 코드 및 데이터 혹은 오류 메시지 반환
statusHTTP 응답 상태 코드를 정의하는 데 사용되는 모듈

✍ status 상태 코드

상태 코드설명
HTTP_200_OK요청 성공, 클라이언트에 데이터 제공
HTTP_201_CREATED요청 성공, 새로운 리소스가 생성
HTTP_204_NO_CONTENT요청 성공, 별도의 데이터 미제공(주고 DELETE에서 사용)
HTTP_400_BAD_REQUEST잘못된 요청으로 서버에서 처리할 수 없음
HTTP_401_UNAUTHORIZED인증이 필요한 리소스에 접근하려고 할 때 사용, 클라이언트 미인증
HTTP_404_NOT_FOUND요청한 리소스를 찾을 수 없음
HTTP_500_INTERNAL_SERVER_ERROR서버 측에서 오류 발생

코드를 저장 후 서버를 실행해 준다.
주소창에 localhost:8000/api/postapi/를 입력하면 아래와 같은 창이 뜨게 된다.

📢 Chrome 실행창

✍ 코드

{
    "title": "POST API",
    "content": "post 되었습니다."
}

JSON형식의 데이터를 입력 후 POST버튼을 눌러준다.

📢 Postman 실행창


Postman같은 경우 왼쪽 GET을 POST로 변경 후 raw-JSON에 입력해야한다.
입력 후 send버튼을 누를 경우 위 이미지와 같이 보여진다.

다시 GET으로 확인해볼경우 정상적으로 데이터가 들어간 것을 확인할 수 있다.


📚 PUT

데이터 수정시 PUT을 사용한다.

✍ 코드

# api/views.py

@api_view(['PUT'])
def putTestAPI(request, id):
    try:
        data = Testapi.objects.get(id=id)
    except Testapi.DoesNotExist:
        return Response({'message': '해당 ID를 가진 데이터를 찾을 수 없습니다.'}, status=status.HTTP_404_NOT_FOUND)

    serializer = TestAPISerializer(data, data=request.data)

    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    
# api/urls.py

urlpatterns = [
    path('getapi/', views.getTestAPI),
    path('postapi/', views.postTestAPI),
    path('putapi/', views.putTestAPI), # 추가
    path('putapi/<int:id>/', views.putTestAPI), # 추가
]

코드설명
@api_view(['PUT'])API 뷰를 정의, HTTP 중 PUT 요청을 처리한다.
try•except예외 처리시 사용
Testapi.objects.get(id=id)ID를 사용하여 데이터베이스에서 해당 레코드를 가져오기
Testapi.DoesNotExistDjango 모델에서 발생하는 예외 중 DB에서 모델 객체를 찾지 못할 때 발생

코드를 저장 후 서버를 실행해 준다.
주소창에 localhost:8000/api/putapi/1/를 입력 후 수정할 내용을 작성해준다.

📢 Postman 실행창

Postman같은 경우 왼쪽 GET을 PUT으로 변경 후 raw-JSON에 입력해야한다.
입력 후 send버튼을 누를 경우 위 이미지와 같이 보여진다.


📚 DELETE

데이터 삭제시 DELETE를 사용한다.

✍ 코드

# api/views.py

@api_view(['DELETE'])
def deleteTestAPI(request, id):
    try:
        Testapi_instance = Testapi.objects.get(id=id)
    except Testapi.DoesNotExist:
        return Response({'message': '해당 ID를 가진 데이터를 찾을 수 없습니다.'}, status=status.HTTP_404_NOT_FOUND)
    Testapi_instance.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)
    
    
# api/urls.py

urlpatterns = [
    path('getapi/', views.getTestAPI),
    path('postapi/', views.postTestAPI),
    path('putapi/<int:id>/', views.putTestAPI),
    path('deleteapi/<int:id>/', views.deleteTestAPI), # 추가
]

코드설명
@api_view(['DELETE'])API 뷰를 정의, HTTP 중 PUT 요청을 처리한다.
Testapi_instance.delete()Django 모델에서 데이터베이스에서 특정 레코드를 삭제하는 메서드

코드를 저장 후 서버를 실행해 준다.
주소창에 localhost:8000/api/deleteapi/2/를 입력 후 send버튼을 누른다.

📢 Postman 실행창

Postman같은 경우 왼쪽 GET을 DELETE 변경 후 send버튼**을 누를 경우 삭제된다.
이후 다시 확인하면 id 2가 사라진 것을 볼 수 있다.


📚 URL하나로 GET, POST, PUT, DELETE하기

하나의 url로 GET, POST, PUT, DELETE를 처리할 수 있다.

✍ 코드

# app/views.py
@api_view(['GET', 'POST', 'PUT', 'DELETE'])
def TestAPI(request, id=None):
    if request.method == 'GET':
        data = Testapi.objects.all()
        serializer = TestAPISerializer(data, many=True)
        return Response(serializer.data)
    
    elif request.method == 'POST':
        serializer = TestAPISerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    elif request.method == 'PUT':
        try:
            data = Testapi.objects.get(id=id)
        except Testapi.DoesNotExist:
            return Response({'message': '해당 ID를 가진 데이터를 찾을 수 없습니다.'}, status=status.HTTP_404_NOT_FOUND)

        serializer = TestAPISerializer(data, data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    elif request.method == 'DELETE':
        try:
            Testapi_instance = Testapi.objects.get(id=id)
        except Testapi.DoesNotExist:
            return Response({'message': '해당 ID를 가진 데이터를 찾을 수 없습니다.'}, status=status.HTTP_404_NOT_FOUND)
        Testapi_instance.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
        
# app/views.py
from django.urls import path
from . import views

urlpatterns = [
    path('testapi/', views.TestAPI),
    path('testapi/<int:id>/', views.TestAPI),
]

데코레이터에 GET, POST, PUT, DELETE를 넣고 elif문으로 어떤 요청인지 받아와 해당 코드를 실행할 수 있다.

📢 Chrome 실행창

📢 Postman 실행창

POST

PUT

DELETE 및 GET

profile
개발자로 성장 중 입니다.

0개의 댓글