오늘도 개발

[1차 프로젝트 록차] 상품 목록 GET api 제작기 1 - RESTful한 엔드포인트 만들기 본문

TIL & 프로젝트 회고

[1차 프로젝트 록차] 상품 목록 GET api 제작기 1 - RESTful한 엔드포인트 만들기

Sueeeeeee 2022. 7. 21. 00:55

이번주부터 다음주까지 녹차 쇼핑몰 클론코딩을 팀별로 진행하고 있다.

지금은 상품 목록 데이터를 응답하는 api를 담당해서 만들고 있다.

 

오늘은 RESTful api에 대해 공부했는데

지금 내가 작업하는 api도 더 RESTful하게 바꿔보고 싶어졌다.

 

그래서 원래 path parameter를 사용해서 다음과 같이 엔드포인트를 만들었는데

/products/1/2
# /products/첫번째 카테고리 아이디/두번째 카테고리 아이디

query parameter를 사용해서 다음과 같이 좀 더 RESTful하게 수정해보았다.

/products/list?category=1

첫 번째 엔드포인트가 더 RESTful하지 않다고 생각한 이유는 두 가지가 있다.

1) 첫번째 엔드포인트는 self-descriptive하지 않다. 

  => 부연설명을 하지 않으면 엔드포인트의 목적을 알 수 없다.

2) 상품 중 특정 카테고리에 속한 것만 필터링하는 기능이므로 path parameter가 어울리지 않는다. 

 

두 번째 엔드포인트는 장고에서 다음과 같이 구현했다.

 

<urls.py>

쿼리 파라미터로 들어갈 ?key=value 부분은 작성하지 않는다.

from django.urls    import path 

from products.views import ProductListView

urlpatterns = [
    path('/list', ProductListView.as_view())
]

 

<httpie>

?를 넣으면 오류가 나므로 다음과 같이 작성한다. 

http -v GET 127.0.0.1:8000/products/list category==1
# 127.0.0.1:8000/products/list?category=1 로 변환됨

 

<views.py>

request.GET[]에 query 파라미터의 키 값(category)을 넣으면 값을 얻을 수 있다. 

class ProductListView(View):
    def get(self, request):
    # request.GET[]에 query 파라미터의 키 값(category)를 넣으면 값을 얻을 수 있다. 
        products = Product.objects.filter(second_category_id=request.GET['category'])
        result = []
        for product in products:
            result.append({
                'id'              : product.id,
                'title'           : product.title,
                'price'           : product.price,
                'stock'           : product.stock,
                'thumbnail_images': [image.url for image in product.thumbnail_images.all()],
                'types'           : [type.name for type in product.types.all()]
            })
        return JsonResponse({'result': result}, status=200)

 

 

 

참고

[DRF] 쿼리스트링을 받을 수 있는 URL 만들기