<Person>
<name>이름</name>
<age>30</age>
<hobby>
<element>축구</element>
<element>야구</element>
</hobby>
</Person>
{name:"이름", age:30, hobby:["축구","야구"]}
분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍쳐의 형식
자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반을 일컫는 말로 웹 상의 자료를 HTTP 위에서 SOAP(Simple Object Access Protocol)이나 쿠키를 통한 세션 트랙킹 같은 별도의 전송 계층없이 전송하기 위한 아주 간단한 인터페이스
REST 원리를 따르는 시스템을 RESTful 하다라고 한다.
6가지 제약조건
http://www.example.com/todo Get 방식이면 가져오는 것 POST 방식이면 삽입 PUT이면 수정 DELETE이면 삭제 이렇게 HTTP 메서드로 작업을 구분REST API를 만들 수 있는 프레임워크
설치: pip install djangorestframework
django-admin startproject 프로젝트이름 경로
python manage.py startapp 애플리케이션이름

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myweb',
'rest_framework',
'apiapp'
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'rest',
'USER':'root',
'PASSWORD':'1234',
'HOST':'127.0.0.1',
'PORT':'3306'
}
}
TIME_ZONE = 'Asia/Seoul'
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('example/', include('apiapp.urls'))
]
from django.urls import path
from .views import helloAPI
urlpatterns = [
path("hello/", helloAPI)
]
from django.shortcuts import render #템플릿 엔진을 이용해서 HTML 출력에 사용
from rest_framework.decorators import api_view
from rest_framework.response import Response #json 데이터 생성에 사용
# Create your views here.
@api_view(['GET'])
def helloAPI(request):
return Response("Hello REST API")
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 127.0.0.1:80localhost/example/hello
응답 결과를 만들기 위한 클래스
인스턴스를 생성할 떄 첫번쨰 클래스 매개변수가 클라이언트에게 전송될 데이터
status는 상태 코드
주요 상태 코드
200: OK
201: Created - 요청은 처리되어서 새로운 리소스를 생성
202: Accepted - 요청은 접수되었지만 처리가 완료되지 않음
3xx: 리다이렉션 중
400: 잘못된 요청
401: 권한이 없음
403: 권한 처리 이외의 사유로 리소스에 대한 엑세스가 금지
404: 지정한 리소스를 찾을 수 없음. 서버에서 처리하는 로직을 찾을 수 없음
500: 내부 서버 오류
응답 결과를 전송할 떄 상태 코드를 같이 전송해서 정상 처리 여부를 알려주는 것이 좋다.
# Create your models here.
class Book(models.Model):
bid = models.IntegerField(primary_key=True)
title = models.CharField(max_length=50)
author = models.CharField(max_length=50)
category = models.CharField(max_length=50)
pages = models.IntegerField()
price = models.IntegerField()
published_date = models.DateField()
descripton = models.TextField()
python manage.py makemigrations
python manage.py migrate
from django.shortcuts import render #템플릿 엔진을 이용해서 HTML 출력에 사용
from rest_framework.decorators import api_view
from rest_framework.response import Response #json 데이터 생성에 사용
from rest_framework import status
from rest_framework.generics import get_object_or_404
from .models import Book
from .serializers import BookSerializer
#하나의 함수를 가지고 GET과 POST를 구분해서 처리
@api_view(['GET', 'POST'])
def booksAPI(request):
if request.method == 'GET':
# 테이블의 전체 데이터 가져오기
books = Book.objects.all()
#가져온 데이터를 JSON 문자열로 변환
serializer = BookSerializer(books, many=True)
#JSON으로 출력
return Response(serializer.data, status = status.HTTP_200_OK)
elif request.method == 'POST':
# 클라이언트에게 전송된 문자열을 모델로 변환
serializer = BookSerializer(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_view(['GET'])
def bookAPI(request, bid):
book = get_object_or_404(Book, bid=bid)
serializer = BookSerializer(book)
return Response(serializer.data, status=status.HTTP_200_OK)
from django.urls import path
from .views import helloAPI, booksAPI, bookAPI
urlpatterns = [
path("hello/", helloAPI),
path("fbv/books/", booksAPI),
path("fbv/book/", bookAPI)
]
{
"bid":1,
"title":"REST API",
"author":"adam",
"category":"development",
"pages":3000,
"price":25000,
"published_date":"1970-05-30",
"description":"안녕하세요"
}


127.0.0.1/example/fbv/bookd와 fbv/book/<bid>로 확인
from django.contrib import admin
from django.urls import path, include
from apiapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('example/', include('apiapp.urls')),
path('ajax/', views.ajax)
]
def ajax(request):
return render(request, "ajax.html")
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script>
//ajax 객체를 생성
let request = new XMLHttpRequest();
//전체 데이터를 가져오는 요청을 생성
request.open('GET', '../example/fbv/books/');
//요청 전송
request.send('')
//응답이오면 호출될 함수를 등록
request.addEventListener("load", () => {
alert(request.responseText)
})
</script>
</html>
서버를 다시 실행하고 브라우저에서 http://127.0.0.1:8000/ajax/를 요청해서 브라우저의 대화상자에 문자열이 출력되는지 확인

JSON Parsing
ajax.html 파일의 스크립트 코드를 수정해서 파싱한 후 출력
//ajax 객체를 생성
let request = new XMLHttpRequest();
//전체 데이터를 가져오는 요청을 생성
request.open('POST', '../example/fbv/books/');
//전송할 데이터를 생성
let formdata = new FormData();
formdata.append('bid', 3);
formdata.append('title', '파이썬');
formdata.append('authoer', "귀도반로썸");
formdata.append('category','programming')
formdata.append('pages', 123)
formdata.append('price', 20900)
formdata.append('published_data', '2024-09-24')
formdata.append('description', '설명')
//데이터를 헤더에 포함시켜서 전송하기
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
let param = ""
for(let pair of formdata.entries()){
param += pair[0] + '=' + pair[1] + '&'
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script>
const data = {
bid:6,
title:'자바',
author:'고슬링',
category:'프로그래밍',
pages:245,
price:38000,
published_date:'2024-09-24',
description:'OOP'
}
fetch('../example/fbv/books/',{
method:'POST',
headers:{
'Content-Type':'application/json'
},
body: JSON.stringify(data)
})
.then((response) => response.json())
.then((data) => {
for(idx in data){
alert(data[idx].bid)
}
})
</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">
axios.get("../example/fbv/books/")
.then((response)=>{
alert(response.data)
})
.catch((error)=>{
//실패했을 떄 처리
alert(error)
})
.then(()=>{
//무조건 수행할 구문
alert("무조건 수행")
})
</script>
</html>