[Web] RESTful API

이승연·2020년 12월 20일
0

Web/Network

목록 보기
4/10
post-thumbnail

RESTful API란?

  • REpresentational State Transfer: 웹에 존재하는 모든 자원에 고유한 URI를 부여하여 자원에 대한 주소를 지정하는 방법론, 또는 규칙. 가장 널리 사용되고 있음. RESTful API는 REST의 특징을 지키며 API를 제공한다는 뜻
  • 각 앤드 포인트는 리소스를 표현하는 고유의 uri 주소를 가지고 있다.
    • URL - Uniform Resource Locator - 자원 위치 = 서버에 있는 파일 위치를 표시함
    • URI - Uniform Resource Identifier - 자원 식별자 = 인터넷 세계 속 자원을 나타내는 유일 주소. 프로토콜에 붙어 있음. = URL의 상위 개념. 즉, URI 안에 URL이 있음
    • ex. http://test.com/test.pdf?docid=111은 URI. http://test.com/test.pdf는 URL. docid=111은 식별자이므로 이게 붙으면 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(페이지) 중심이 아니라 자원(데이터)을 중심으로 정리해야 한다.

0개의 댓글