RESTful API란?
- REpresentational State Transfer: 웹에 존재하는 모든 자원에 고유한 URI를 부여하여 자원에 대한 주소를 지정하는 방법론, 또는 규칙. 가장 널리 사용되고 있음. RESTful API는 REST의 특징을 지키며 API를 제공한다는 뜻
- 각 앤드 포인트는 리소스를 표현하는 고유의 uri 주소를 가지고 있다.
- RESTful API는 백엔드에서 엔드포인트 구조를 구현하는 방식 중 가장 오래되고 널리 쓰임. 나머지 하나는 GraphQL API이며 백엔드가 정해놓은것만 받아오느게 아니라 필요한걸 따로 요청하는 방법이라고 생각하면 된다.
Path paramter (URL)
- path parameter같은 경우는 웹페이지 주소에서 물음표(?) 전까지 오는 아이들이다. 페이지라고 생각해주면 된다.
- URL이니 장고앱에서도 각 앱의 URL.py에 작성해주면 된다.
- 예를 들어, e-commerce 웹사이트의 각 상품 상세페이지를 보고 싶을 때는
path('product/<int:id>', ProductView.as_view())
를 추가해주고 views.py의 해당 클래스에 id값을 인자로 넣어준다. 그렇게 되면 클래스 내에서 id라는 변수는 product의 id가 되는 것이다! 자유롭게 쓰자!!
- httpie로 테스트하는 방법:
http -v GET localhost:8000/product/1
Query string 또는 query parameter (URI)
- Query string부터 재밌어진다. 웹사이트 주소를 보면 물음표(?)가 갑자기 등장할때가 있다. 지금 내가 쓰고 있는 이 페이지만 해도 물음표가 있다 --> https://velog.io/write?id=.....
- 이 말은 write라는 url을 따라가면 글을 작성할 수 있는 페이지가 나온다는 것이다. 물음표(?) 후에 나오는 것은 그 페이지 내에서 데이터를 어떻게 보여줄 것인지 결정하는 query string이다.
- 아까의 예로 돌아가자. Ecommerce 웹사이트에서 한 카테고리에 해당하는 제품을 높은 가격 순으로 보고 싶다면?
- 카테고리: request.GET.get을 사용하자. 다음의 예시에서는 http request로 온 데이터 중 'category'라는 필드의 값을 category_seq 변수로 저장해주었다. 그리고 filter() 메서드를 사용하여 그에 해당하는 제품만 걸러내어 주었다.
- 높은 가격 순: 어떤 기준으로 sorting할 것인지는 sort 변수로 저장해주었다. 그리고 order_by 메서드를 사용하여 높은 가격 순으로 나열해주었다.
- 뒤에 values()를 빠트리지 말자. fiter()은 해당하는 object가 담긴 queryset을 반환해주기 때문에 non-iterable하기 때문에 values()를 사용하여 dictionary 형태로 반환해야한다.
class CategoryView(View):
def get(self, request):
category_seq = request.GET.get('category', None)
sort = request.GET.get('sort', None)
product_list = list(Product.objects.filter(category=category_seq).order_by(sort).values())
return JsonResponse({"message" : "SUCCESS", "result" : product_list}, status = 200)
-
httpie로 테스트하는 방법:
http -v GET localhost:8000/product/category category==13 subcategory==277 sort==price
-
Path paramter와 Query string은 잘만 쓰면 같은 기능을 구현할 수 있다. 그럼에도 불구하고 이들을 써주어야하는 상황은 구분되어 있다.
-
Query string을 언제 쓰냐면:
- 필터링할 때 (filtering)
- 정렬할 때 (ex. GET /Products?ordering =-id) (sorting)
- 페이지네이션할 때
- 검색할 때 (ex. GET /Products? = 홍길동) (searching)
-
즉, View(페이지) 중심이 아니라 자원(데이터)을 중심으로 정리해야 한다.