URLを返す
RESTアーキテクチャスタイルを他のネットワークベースのスタイルと区別する中心的な特徴は、コンポーネント間の均一なインターフェースを重視していることです。
— Roy Fielding, アーキテクチャスタイルとネットワークベースのソフトウェアアーキテクチャの設計
原則として、Web APIからは、/foobar
のような相対URIを返すよりも、http://example.com/foobar
のような絶対URIを返す方が良いでしょう。
そうすることの利点は以下のとおりです。
- より明示的である。
- APIクライアントの作業が少なくて済む。
- ネイティブURI型を持たないJSONのような表現で見つかった場合、文字列の意味についてあいまいさがない。
- ハイパーリンクを使用してHTML表現をマークアップするのが簡単になる。
REST frameworkには、Web APIから絶対URIを返すのを簡単にするための2つのユーティリティ関数が用意されています。
これらを使用する必要はありませんが、使用する場合は、自己記述APIが自動的にその出力をハイパーリンクできるようになり、APIの閲覧がはるかに簡単になります。
reverse
シグネチャ: reverse(viewname, *args, **kwargs)
django.urls.reverse
と同じ動作をしますが、ホストとポートを決定するためにリクエストを使用して、完全修飾URLを返します。
関数には、以下のように、リクエストをキーワード引数として含める必要があります。
from rest_framework.reverse import reverse
from rest_framework.views import APIView
from django.utils.timezone import now
class APIRootView(APIView):
def get(self, request):
year = now().year
data = {
...
'year-summary-url': reverse('year-summary', args=[year], request=request)
}
return Response(data)
reverse_lazy
シグネチャ: reverse_lazy(viewname, *args, **kwargs)
django.urls.reverse_lazy
と同じ動作をしますが、ホストとポートを決定するためにリクエストを使用して、完全修飾URLを返します。
reverse
関数と同様に、関数には、以下のように、リクエストをキーワード引数として含める必要があります。
api_root = reverse_lazy('api-root', request=request)