DRF Tutorial

DRF Tutorial 2: Requests and Responses 2

waterclean101 2023. 2. 14. 14:04

URL에 선택적 형식 접미사(optional format suffixes) 추가하기

응답이 더 이상 단일 콘텐츠 유형에 고정되어 있지 않다는 것을 활용하기 위해 API 엔드포인트에 형식 접미사 지원을 추가해 보자. 형식 접미사를 사용하면 특정 형식을 명시적으로 참조하는 URL이 제공되므로 API가 http://example.com/api/items/4.json 같은 URL을 처리할 수 있다.

다음과 같이 두 뷰에 형식 키워드 인수를 추가하자.

def snippet_list(request, format=None):
def snippet_detail(request, pk, format=None):

 

이제 snippets/urls.py 파일을 업데이트하여 기존 URL에 format_suffix_patterns 세트를 추가한다.

# snippets/urls.py

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

urlpatterns = [
    path('snippets/', views.snippet_list),
    path('snippets/<int:pk>/', views.snippet_detail),
]

urlpatterns = format_suffix_patterns(urlpatterns)

이러한 추가 URL 패턴을 반드시 추가할 필요는 없지만 특정 형식을 간단하고 깔끔하게 참조할 수 있는 방법을 제공한다.

 

How's it looking?

튜토리얼 1에서 했던 것처럼 커맨드 라인에서 API를 테스트 해보자. 전과 유사하게 작동하지만, 잘못된 요청을 보낼 경우 오류 처리가 좀 더 개선된 것을 볼 수 있다.

http http://127.0.0.1:8000/snippets/

HTTP/1.1 200 OK
...
[
  {
    "id": 1,
    "title": "",
    "code": "foo = \"bar\"\n",
    "linenos": false,
    "language": "python",
    "style": "friendly"
  },
  {
    "id": 2,
    "title": "",
    "code": "print(\"hello, world\")\n",
    "linenos": false,
    "language": "python",
    "style": "friendly"
  }
]

 

Accept 헤더를 사용하여 반환되는 응답의 형식을 제어할 수 있다.

http http://127.0.0.1:8000/snippets/ Accept:application/json  # Request JSON
http http://127.0.0.1:8000/snippets/ Accept:text/html         # Request HTML

또는 형식 접미사를 추가하여 사용할 수도 있다.

http http://127.0.0.1:8000/snippets.json  # JSON suffix
http http://127.0.0.1:8000/snippets.api   # Browsable API suffix

마찬가지로 콘텐츠 유형 헤더를 사용하여 전송하는 요청의 형식을 제어할 수 있다.

# POST using form data
http --form POST http://127.0.0.1:8000/snippets/ code="print(123)"

{
  "id": 3,
  "title": "",
  "code": "print(123)",
  "linenos": false,
  "language": "python",
  "style": "friendly"
}

# POST using JSON
http --json POST http://127.0.0.1:8000/snippets/ code="print(456)"

{
    "id": 4,
    "title": "",
    "code": "print(456)",
    "linenos": false,
    "language": "python",
    "style": "friendly"
}

 

위의 http 요청에 --debug 스위치를 추가하면 요청 헤더에서 요청 유형을 확인할 수 있다.

 

Browsability


API는 클라이언트 요청에 따라 응답의 콘텐츠 유형을 선택하기 때문에 기본적으로 웹 브라우저에서 리소스를 요청할 때 리소스의 HTML 형식 표현을 반환한다. 이를 통해 API는 웹 브라우저에서 완전히 검색 가능한 HTML 표현을 반환할 수 있다.

웹 브라우징이 가능한 API를 사용하면 사용 편의성이 크게 향상되고 API 개발과 사용이 훨씬 쉬워집니다. 또한 API를 검사하고 작업하려는 다른 개발자의 진입 장벽을 크게 낮출 수 있다.