安らかなURLを設計する方法を決定するのに苦労しています。私は、動詞ではなく名詞でURLを使用する安らかなアプローチに賛成しています。これを行う方法は理解できません。
金融計算機を実装するサービスを作成しています。計算機は、CSVファイルを介してアップロードする一連のパラメーターを受け取ります。ユースケースには次のものが含まれます。
安らかなアプローチは、次のタイプのURLを持つことです。
/parameters
/parameters/12-23-2009
次の3つのユースケースを達成できます。
しかし、動詞なしで4番目と5番目のユースケースをどのように行いますか?次のようなURLは必要ありませんか?
/parameters/ID/activate
/parameters/ID/validate
?
おそらく次のようなもの:
PUT /parameters/activation HTTP/1.1
Content-Type: application/json; encoding=UTF-8
Content-Length: 18
{ "active": true }
適切なURIデザインの一般原則:
/resource
または/resource/
のいずれかを優先します;使用しないものから301リダイレクトを作成する(注:「RESTful URI design」とは言いませんでした。RESTではURIは本質的に不透明です。)
HTTPメソッド選択の一般原則:
HTTPを使用したWebサービス設計の一般原則:
201 Created
。リソースmustは、応答の送信時に存在する必要があります202 Accepted
400 Bad Request
誰かが明らかに偽のデータに対して操作を行ったとき。アプリケーションの場合、これは検証エラーである可能性があります。通常、キャッチされない例外用に500を予約します401 Unauthorized
は、誰かが必要なAuthorization
ヘッダーを提供せずにAPIにアクセスした場合、またはAuthorization
内の資格情報が無効な場合。 Authorization
ヘッダーを介した資格情報を期待していない場合は、この応答コードを使用しないでください。403 Forbidden
は、誰かが悪意のある方法でAPIにアクセスした場合、または許可されていない場合405 Method Not Allowed
誰かがPOSTを使用する場合、PUTなどを使用する必要がある場合413 Request Entity Too Large
誰かが容認できないほど大きなファイルを送ろうとしたとき418 I'm a teapot
ティーポットでコーヒーを入れようとする場合ETag
ヘッダーは、リソースをハッシュ値に簡単に削減できる場合に適していますLast-Modified
は、リソースが更新されたときのタイムスタンプを保持することをお勧めします。Cache-Control
およびExpires
には適切な値を指定する必要がありますIf-None-Modified
、If-Modified-Since
)特定の質問に関しては、POSTを#4と#5に使用する必要があります。これらの操作は、上記の「RPCのような」ガイドラインに該当します。 #5の場合、POSTは必ずしもContent-Type: application/x-www-form-urlencoded
を使用する必要がないことに注意してください。これは、JSONまたはCSVペイロードと同じくらい簡単にできます。
新しい動詞が必要と思われる場合は、その動詞を名詞に変えることを検討してください。たとえば、「アクティベート」を「アクティベーション」に、「検証」を「検証」に変更します。
しかし、あなたが書いたことから、あなたのアプリケーションにはもっと大きな問題があると思います。
「パラメータ」と呼ばれるリソースが提案されるたびに、すべてのプロジェクトチームメンバーの心に危険信号を送信する必要があります。 「パラメータ」は文字通りあらゆるリソースに適用できます。それは十分に具体的ではありません。
「パラメーター」とは正確に何を表していますか?おそらくさまざまなものがあり、それぞれに専用のリソースが必要です。
これを実現する別の方法-アプリケーションをエンドユーザー(おそらくプログラミングについてほとんど知らない人)と話し合うとき、彼ら自身が繰り返し使用する言葉は何ですか?
これらは、アプリケーションを設計するときに使用する必要がある言葉です。
見込み客とのこの変換をまだ行っていない場合は、すぐにすべてを停止し、実行するまで別のコード行を記述しないでください!そうしてはじめて、チームは何を構築する必要があるかを知ることができます。
金融ソフトウェアについては何も知りませんが、推測しなければならない場合、リソースの一部は「レポート」、「支払い」、「振替」、「通貨」などの名前で行くかもしれません。
ソフトウェア設計プロセスのこの部分に関する多くの優れた本があります。推奨できる2つは、 ドメイン駆動設計 と 分析パターン です。
URLの設計は、アプリケーションがRESTfulかどうかとは関係ありません。したがって、「RESTful URLS」というフレーズはナンセンスです。
RESTが実際に何であるかについて、さらに読む必要があると思います。 RESTはURLを不透明として扱います。そのため、動詞、名詞、その他何が含まれているかはわかりません。それでもURLを設計したいかもしれませんが、それはRESTではなくUIについてです。
それでは、あなたの質問に行きましょう。最後の2つのケースはRESTfulではなく、どのような安らかなスキームにも適合しません。これらはRPCと呼ばれるものです。 RESTを真剣に考えている場合は、アプリケーションがどのように機能するかを一から考え直す必要があります。または、RESTを放棄して、アプリをRPCアプリとして実行します。
多分そうではありません。
ここでの考え方は、すべてをリソースとして扱う必要があるということです。したがって、一連のパラメーターに参照できるURLがあれば、追加するだけです。
[parametersurl]/validationresultsを取得します
投稿[paramatersurl]
body:{command: "activate"}
繰り返しになりますが、そのアクティベートはRESTではなくRPCです。
アクティブ化および検証の要件は、リソースの状態を変更しようとしている状況です。注文を「完了」したり、他のリクエストを「送信」したことも同じです。これらの種類の状態変化をモデル化する方法は多数ありますが、同じ状態のリソースのコレクションリソースを作成してから、コレクション間でリソースを移動して状態に影響を与えることがよくあることです。
例えば次のようなリソースを作成します。
/ActiveParameters
/ValidatedParameters
パラメーターのセットをアクティブにしたい場合は、そのセットをActiveParametersコレクションに追加します。次のように、一連のパラメーターをエンティティ本体として渡すか、URLをクエリパラメーターとして渡すことができます。
POST /ActiveParameters?parameter=/Parameters/{Id}
/ ValidatedParametersでも同じことができます。パラメータが有効でない場合、サーバーはリクエストに「Bad Request」を返して、検証済みパラメータのコレクションにパラメータを追加できます。
次のメタリソースとメソッドをお勧めします。
パラメータをアクティブにするか、検証します:
> PUT /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Content-Type: application/json
> Connection: close
>
> {'active': true, 'require-valid': true}
>
< HTTP/1.1 200 OK
< Connection: close
<
パラメーターがアクティブで有効かどうかを確認します。
> GET /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Connection: close
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Connection: close
<
< {
< 'active': true,
< 'require-valid': true,
< 'valid': {'status': false, 'reason': '...'}
< }
<
REST環境では、各URLは一意のリソースです。あなたのリソースは何ですか?財務計算機には、明らかなリソースはありません。パラメーターを呼び出しているものを掘り下げ、リソースを引き出す必要があります。たとえば、ローンの償却カレンダーがリソースになる場合があります。カレンダーのURLには、start_date、期間(月または年単位)、期間(利息が複利される場合)、金利、および初期原則が含まれる場合があります。これらのすべての値を使用すると、特定の支払いカレンダーがあります。
http://example.com/amort_cal/2009-10-20/30yrsfixed/monthly/5.00/200000
今、私はあなたが何を計算しているのかわかりませんが、パラメータリストの概念はRESTfulに聞こえません。他の誰かが言ったように、上記の要件はよりXMLRPCに聞こえます。 RESTを探している場合は、名詞が必要です。計算は名詞ではなく、名詞に作用する動詞です。計算から名詞を引き出すには、向きを変える必要があります。
編集:実際、URIはGET
リクエストがべき等性のままになるのを防いでいたでしょう。
ただし、検証では、HTTPステータスコードを使用して要求の有効性を通知する(新しいパラメータを作成するか、既存の「パラメータ」を変更する)ことは、Restfulモデルに適合します。
送信されたデータが無効であり、再送信する前にリクエストを変更する必要がある場合は、400 Bad Request
ステータスコードで報告してください( HTTP/1.1 Status Codes )。
ただし、これは、ユースケースのように遅延するのではなく、送信時に検証することに依存しています。他の回答には、そのシナリオに適したソリューションがあります。