728x90

 

 

--RESTful API

REpresentational State Transfer

 

요청 ->

서버 리소스의 상태 전달

 

Client ---------request--------> Server

         <--------response-------

 

WAS(web application server)

django = application server의 역할을 함

 

tomcat, webLogic,

프로토콜, 인터페이스 : 서로간의 데이터 통신규약을 정해서 맞춰야함.

 

REST 방식 : 서버가 갖고있는 리소스 상태를 전달해주기 위한 방법 : REST API (html을 전달하는 것이 아님)

데이터 포맷을 상관하지 않고 전달할 수 있으므로 다양한 어플리케이션에서 활용가능함

 

Android : java, kotlin

ios : objective-c, swift

 

Resource(server가 가지고 있는 data)

HTTP 프로토콜 + method type(post, get, put, delete)

 

URI (server + resource) : 좀 더 포괄적인 의미

URL (http프로토콜 사용하는 것)

 

0단계 : Expose Soap Web Services in Rest Style

1단계 : Expose Resources with Proper URI

           Note : Improper Use of Http Methods

2단계 : LEVEL 1 + Http Methods(GET, POST, PUT, DELETE)

3단계 : LEVEL 2 + HATEOAS, DATA + Next Possible Actions

  • Hypermedia as the Engine of Application State

  • It basically means that your application state should be Hypermedia driven.

  • Hypermedia? - Basically hyperlinks to other resources.

  • Which also means that, once a client access a resource, it can use the hypermedia to navigate your resources.

 

-- Best Pratices in Restful Design

  • Consumer First

  • Make Best Use of Http

  • No Secure Info in URI

  • Use Plurals

    • Prefer /users to /user

    • Prefer /users/1 to/user/1

  • Use Nouns for Resources

  • For Exceptions

    • /search, PUT/ gists/{id}/star, DELETE/gists/{id}/star

    • Define A Consistent Approach

 

 

  • Response Status

    • 200 - SUCCESS(get, delete 성공)

    • 201 - CREATED(post, put 성공)

    • 400 - BAD REQUEST

    • 401 - UNAUTHORIZED

    • 403 - NOT CERTIFICATED

    • 404 - RESOURCE NOT FOUND

    • 405 - NOT FOUND

    • 500 - SERVER ERROR(버그, 시스템)

 

--django REST framework

 

Home - Django REST framework

 

www.django-rest-framework.org

 

 

**django REST framework

  1. Serializers

    • 기존) Django ORM의 QuerySet -> Template -> HTML로 렌더링

    • REST) QuerySet -> JSON

    • Client에게 전달하기 위한 Format

  • serializers.py

 

Meta : Model을 정의할 때 부가적인 설정을 할 때의 클래스 명

 

   

    2. Views

    • ViewSet

      • list(), create()와 같은 액션 제공

      • urlconf에 등록하기 보다는, router 클래스로 등록하면 자동으로 urlconf가 결정

      • 직접 ViewSet을 작성하는 것 대신, 기본 클래스 사용가능

 

  • rest_views.py

 

    3. URLs

    • mysite/urls.py

 

    4. Pagination

    • 반환하는 데이터의 개수

    • mysite/settings.py

 

    5. Testing

    • $python manage.py runserver

    • Postman 사용

 

 

#blog/serializers.py

from django.contrib.auth.models import User, Group
from rest_framework import serializers

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email']
# class GroupSerializer(serializers.HyperlinkedModelSerializer):
    # class Meta:
        # model = Group
        # fields = ['url', 'name']

 

#blog/rest_views.py

from django.contrib.auth.models import User
from rest_framework import viewsets
from rest_framework import permissions
from blog.serializers import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]

 

#mysite/urls.py

from rest_framework import routers
from blog import rest_views

router = routers.DefaultRouter()
router.register(r'users', rest_views.UserViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', HomeView.as_view(), name='home'),
    path('bookmark/', include('bookmark.urls', namespace='bookmark')),
    path('blog/', include('blog.urls', namespace='blog')),
    
    path('api/', include(router.urls)),
    path('api-auth', include('rest_framework.urls', namespace='rest_framework'))
]

#mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bookmark.apps.BookmarkConfig',
    'blog.apps.BlogConfig',
    'rest_framework',
]

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE' : 10
}

 

 

$python manage.py startapp api

 

#mysite/urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', HomeView.as_view(), name='home'),
    path('bookmark/', include('bookmark.urls', namespace='bookmark')),
    path('blog/', include('blog.urls', namespace='blog')),
    
    # path('api/', include(router.urls)),
    # path('api-auth', include('rest_framework.urls', namespace='rest_framework'))
    
    path('api/', include('api.urls', namespace='api'))
    
]

 

#api/serializers.py

from rest_framework import serializers
from blog.models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'slug', 'description', 'content', 'create_date', 'modify_date']

#api/views.py

from rest_framework import viewsets
from rest_framework import permissions
from api.serializers import PostSerializer
from blog.models import Post

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = [permissions.IsAuthenticated]

#api/urls.py

from django.urls import path, include
from api.views import PostViewSet

app_name = 'api'

post_list = PostViewSet.as_view({ 'get':'list' })
post_detail = PostViewSet.as_view({ 'get':'retrieve' })

urlpatterns = [
    path('auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('posts/', post_list, name='post_list'),
    path('posts/<int:pk>', post_detail, name='post_detail'),
]

 

#mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bookmark.apps.BookmarkConfig',
    'blog.apps.BlogConfig',
    'rest_framework',
    'api',
]

 

 

 

**웹브라우저 사용

**Postman 사용

 

 

728x90

+ Recent posts