API(Application Programming Interface)
프로그래밍 언어가 제공하는 기능을 수행할 수 있게 만든 인터페이스
프로그래밍을 활용해서 할 수 있는 어떤 것
CLI, GUI는 각각 명령줄과 그래픽(아이콘)을 통해서 특정 기능을 수행하는 것이며,
API는 프로그래밍을 통해 그 일을 수행할 수 있음
URI(Uniform Resource Identifier)
통합 자원 식별자
인터넷의 자원을 나타내는 유일한 주소
인터넷에서 자원을 식별하거나 이름을 지정하는데 사용되는 간단한 문자열
URI이란, 웹 서버가 리소스를 고유하게 식별할 수 있도록 하는 것으로써, URL과 URN 두 가지가 있는데 일반적으로 URL을 사용합니다.
모든 URL 은 URI 다. (URI가 더 포괄적인 개념)
하지만 모든 URI 가 URL은 아니다.
URL(Uniform Resource Locator)
URN(Uniform Resource Name)
스킴 ( scheme )
사용할 프로토콜을 말하며, 리소스에 어떻게 요청, 접근할 것인지를 명시합니다.
웹에서 주로 HTTP 프로토콜을 사용합니다.
사용자 이름과 비밀번호
어떤 서버들은 자신이 가지고 있는 데이터에 접근하기 위해서 사용자의 이름과 비밀번호를 요구합니다.
만약 웹 서버에서 사용자이름과 비밀번호를 요구하는 URL 스킴을 사용함에도 클라이언트가 이를 명시하지 않고 URL에 접근한다면, 기본값으로 "사용자 이름 : anonumous , 비밀번호는 브라우저에서 제공하는 기본 값"을 따르게 됩니다.
호스트와 포트
하나의 Host( 컴퓨터 )에는 여러 개의 Process( 프로그램 )이 각각의 Socket( 소켓 )을 사용하여 데이터 통신을 하고 있기 때문에, 각각의 소켓을 구분할 필요가 있습니다.
이 때 소켓을 구분하는 역할을 하는 것이 Port( 포트 )입니다.
HTTP 프로토콜에서 포트 번호를 명시하지 않으면, 80번 포트를 기본 값으로 사용합니다. ( Well-known port - 링크 )
경로
여기서부터는 URL 이 아닌 URI
질의
Query String( 쿼리 스트링 )이라고도 합니다.
클라이언트가 자원을 GET 방식으로 요청할 때, 필요한 데이터를 함께 넘겨 줄 목적으로 사용합니다.
프래그먼트
HTML에는 각각의 요소에 id 속성을 부여할 수 있는데요, URL에 프래그먼트를 전달하면 페이지가 해당 id가 있는 곳으로 스크롤이 이동하게 됩니다.
이 글의 URL에 프래그먼트를 추가하면, 가장 마지막으로 이동할 것입니다.
https://www.django-rest-framework.org/api-guide/serializers/#modelserializer
Serializer 폴더 만들고 > Model 만들듯이 Serializer 만듬
django seed 설치
'django_seed'
추가DRF 설치
pip install djangorestframework
settings.py > INSTALLED_APPS 에 'rest_framework',
추가
python manage.py makemigrations
python manage.py migrate
더미 데이터 넣기
articles > urls.py
path('json-1/', views.article_json_1),
articles > views.py
from django.http.response import JsonResponse
def article_json_1(request) :
articles = Article.objects.all()
aritcles_json = []
for article in articles :
aritcles_json.append(
{
'id': article.pk,
'content': article.content
}
)
return JsonResponse(aritcles_json, safe=False) # safe는 dictionary가 아닌 타입이 JsonResponse의 매개변수로 들어갈 시에 false로 바꿔줘야함
articles > urls.py
path('json-2/', views.article_json_2),
articles > views.py
from django.http.response import HttpResponse
from django.core import serializers
def article_json_2(request) :
articles = Article.objects.all()
data = serializers.serialize('json', articles)
return HttpResponse(data, content_type="application/json") # response header에 명시되는 content-type 써주기
articles > urls.py
path('json-3/', views.article_json_3),
articles > serializers.py
만들기
from rest_framework import serializers
from .models import Article
class ArticleSerializers(serializers.ModelSerializers) :
class Meta :
model = Article
fields = '__all__'
articles > views.py
from rest_framework.response import Response
from rest_framework.decorators import api_views
from .serializers import ArticleSerializers
@api_view(['GET', 'POST'])
def article_json_3(request) :
articles = Article.objects.all()
serializer = ArticleSerializers(articles, many=True) # many는 복수객체 이냐 단일객체 이냐를 나타냄. 복수라서 True
return Response(serializer.data)
설치 방법
pip install -U drf-yasg
settings.py > INSTALLED_APPS
에 추가
'django.contrib.staticfiles', # required for serving swagger ui's css/js files
'drf_yasg',
사용방법
urls.py
에
...
from django.urls import re_path
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
...
schema_view = get_schema_view(
openapi.Info(
title="Snippets API",
default_version='v1',
description="Test description",
terms_of_service="https://www.google.com/policies/terms/",
contact=openapi.Contact(email="contact@snippets.local"),
license=openapi.License(name="BSD License"),
),
public=True,
permission_classes=[permissions.AllowAny],
)
urlpatterns = [
# 정규표현식
re_path('^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
re_path('^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
re_path('^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
...
]
127.0.0.1:8000/swagger/
로 접속 - api 테스트용# POST 방식으로 보내는 것들은 이거 처리 안하면 에러남
from drf_yasg.utils import swagger_auto_schema
@swagger_auto_schema(method=['POST'], request_body=CommentSerializer)
@api_view(['GET', 'POST'])
def article_list(request) :
if request.method=="GET" :
articles = get_list_or_404(Article)
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data)
elif request.method=="POST" :
# 생성 - modelForm 으로 하는 것과 매우 유사
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid(raise_exception=True) : # raise_exception=True를 통해 밑에 저장 실패 부분을 대신할 수 있음
serializer.save() # 데이터베이스에 저장
return Response(serializer.data, status=status.HTTP_201_CREATED) # 저장성공을 알림
# return Response(serializer.error, status = status.HTTP_400_BAD_REQUEST) # 저장 실패를 알림
127.0.0.1:8000/redoc/
로 접속 - doc 자동으로 만들어지는 용도