動詞なしでREST URLを作成する方法は?


283

安らかなURLを設計する方法を決定するのに苦労しています。動詞がこれを行う方法を理解していない、名詞とURLを使用する安らかなアプローチに私はすべて賛成です。

財務計算機を実装するサービスを作成しています。計算機は、CSVファイルを介してアップロードする一連のパラメーターを受け取ります。ユースケースには以下が含まれます。

  1. 新しいパラメータをアップロードする
  2. 最新のパラメーターを取得する
  3. 特定の営業日のパラメーターを取得する
  4. パラメータのセットをアクティブにします
  5. 一連のパラメーターを検証する

私は、次のタイプのURLを持つことで、安静なアプローチを収集します。

/parameters
/parameters/12-23-2009

最初の3つの使用例は、次の方法で実現できます。

  1. ポストリクエストにパラメータファイルを含めるPOST
  2. 最初のURLのGET
  3. 2番目のURLのGET

しかし、動詞なしで4番目と5番目のユースケースをどのように実行しますか?次のようなURLは必要ではないでしょうか。

/parameters/ID/activate
/parameters/ID/validate

??


3
部分的な更新には、POSTよりもPATCHの方が好みです。
user2016971 2013年

回答:


71

おそらく次のようなものです:

PUT /parameters/activation HTTP/1.1
Content-Type: application/json; encoding=UTF-8
Content-Length: 18

{ "active": true }

1
POSTリクエストを送信するたびにパラメータを確認するなどの「手順」を実行する必要がある場合は問題ありません。ただし、リソースの(アプリケーション)状態を変更すると、実際には既存のリソースが更新され、新しいリソースを作成したり、処理要求を送信したりすることはありません。
Andrey Vlasovskikh、2009年

19
PUTは、新しいリソースを作成するため、または特定のURLに新しいリソースを(全体ではなく部分的に)配置するためのものです。PUTがこのケースにどのように適合するかわかりません。
ブルトン語

30
実際には、POSTVSはPUTまったく同じではありませんinsertupdatePUT指定されたパスに対応するリソースを更新するか、指定されたパスに対応する新しいリソースを作成します。POSTどこかに新しいリソースを作成します。たとえば、PUT /blog/posts/3/comments/5は適切なコメントを更新しPOST /blog/posts/3/comments、新しいcommentリソースを作成します(応答で新しいリソースへのパスを返す必要があります)。
yfeldblum 2009年

23
@Justice @Bretonより重要な違いは、べきPUT等でPOSTはないのにべき等であるということです。通常、提供するものに可能な限り多くの制約を課して、結果を得る必要があります。に固執することPUTで、サービスのクライアントにより多くの情報が提供されます。
Andrey Vlasovskikh、2009年

3
リソースは/ parameters / statusである場合もあり、リクエストの本文は単に「アクティブ」である場合もあります。そうすれば、まったく新しいリソースを特定のURLに配置することになります。
Carlos Aguayo、2011

991

適切なURI設計の一般原則:

  • クエリパラメータを使用して状態を変更しない
  • できる場合は、大文字と小文字が混在するパスを使用しないでください。小文字が最適です
  • URI(.php、.py、.plなど)で実装固有の拡張子を使用しないでください。
  • URIでRPCに陥らないでください
  • ください可能な限りあなたのURIのスペースを制限
  • パスセグメントを短くしてください
  • /resourceまたはのどちらかを選択してください/resource/。使用しないリダイレクトから301リダイレクトを作成する
  • リソースの副選択にはクエリパラメータを使用してください。つまり、ページネーション、検索クエリ
  • 実行(Do) HTTPヘッダや本文にあるべきURIのうち移動のもの

(注:「RESTful URI設計」とは言いませんでした。URIはRESTでは本質的に不透明です。)

HTTPメソッド選択の一般原則:

  • GETを使用して状態を変更しないください。これは、Googlebotが1日を台無しにするのに最適な方法です
  • リソース全体を更新するのでない限り、PUTを使用しないでください
  • 同じURIで正当にGETを実行できる場合を除いて、PUTを使用しないでください。
  • POSTを使用して、長期間存続する情報、またはキャッシュするのが妥当な情報を取得しないでください。
  • PUTでべきでない操作を実行しない
  • できるだけGETを使用してください
  • 疑わしい場合は、PUTよりもPO​​STを使用してください
  • RPCのような感じの何かをする必要があるときはいつでもPOSTを使用してください
  • より大きなまたは階層的なリソースのクラスにはPUTを使用してください
  • リソースを削除するには、POSTではなくDELETEを使用してください
  • 実行(Do)計算などで使用GET、あなたの入力が大きい場合を除き、その場合の使用POST中

HTTPを使用したWebサービス設計の一般原則:

  • ヘッダー内にあるはずの応答の本文にメタデータを入れないでください
  • メタデータを含めると大幅なオーバーヘッドが発生しない限り、メタデータを別のリソースに配置しないでください。
  • 適切なステータスコードを使用して ください
    • 201 Createdリソースを作成した後。応答の送信時にリソース存在している必要あります
    • 202 Accepted 操作を正常に実行した後、またはリソースを非同期で作成した後
    • 400 Bad Request誰かが明らかに偽のデータを操作したとき。アプリケーションの場合、これは検証エラーになる可能性があります。通常、キャッチされない例外のために500を予約します
    • 401 Unauthorized誰かが必要なAuthorizationヘッダーを提供せずにAPIにアクセスしたとき、または内の資格情報Authorizationが無効なとき。Authorizationヘッダーを介した認証情報を期待していない場合は、この応答コードを使用しないでください。
    • 403 Forbidden 誰かが悪意のある方法でAPIにアクセスした場合、または許可されていない場合
    • 405 Method Not Allowed 誰かがPUTを使用すべきだったときにPOSTを使用したときなど
    • 413 Request Entity Too Large 誰かがあなたに受け入れられないほど大きなファイルを送ろうとしたとき
    • 418 I'm a teapot ティーポットでコーヒーを入れようとしたとき
  • 可能な場合は常にキャッシングヘッダーを使用 してください
    • ETag ヘッダーは、リソースをハッシュ値に簡単に削減できる場合に適しています
    • Last-Modified リソースが更新されたときのタイムスタンプを維持することをお勧めします
    • Cache-Controlそして、Expires適切な値を与える必要があります
  • やるリクエストのヘッダーをキャッシュ称えるためにあなたができることはすべてを(If-None-ModifiedIf-Modified-Since
  • 意味のある場合はリダイレクトを使用ますが、Webサービスではこれらはまれです。

特定の質問については、POSTを#4と#5に使用する必要があります。これらの操作は、上記の「RPCのような」ガイドラインに該当します。#5の場合、POSTでは必ずしもを使用する必要がないことに注意してくださいContent-Type: application/x-www-form-urlencoded。これは、JSONまたはCSVペイロードと同じくらい簡単にできます。


11
413は、送信されているリクエストのサイズを意図しているため、ギグのデータを送信する誰かを丁寧に拒否できます。多くの場合、411と組み合わせて、送信されている量を他の人に強制的に伝えます。413に対して与えられた例では、400がより適切な応答になると思います。
Garry Shutler、

5
これは素晴らしいリソースなので、+ 1。ただし、これは一般的なリソースであり、直接質問に答えることはしません。これには、特定の回答を含む追加の段落を含めるのが理想的です。
サミュエルネフ

@GarryShutlerグッドキャッチ、あなたは絶対的に正しいです。編集ありがとうございます。
ボブ・アマン

1
はい、オブジェクト全体を上書きする場合にのみPUTを使用します。ただし、リソースの部分的な更新の場合、PATCHまたはPOSTのいずれかが妥当であると私は主張します。PATCHは、操作が何を行うかという点でより明確ですが、すべてのクライアントがPATCHリクエストを発行できるわけではないので、代わりにPOSTを許可することが完全に適切であり、私は、POSTがあれば、常にフォールバックとして許可すべきパッチが使用されています。
ボブ・アマン

1
409エラーの場合は+1。400エラーは、十分なクライアント側の検証によって解決できるものです。409は、リクエスト自体は受け入れ可能で一貫しているが、サーバー状態の一部の側面(通常は同時実行制御ですが、理論的には非入力制約)と競合することを明確にします。
2017年

18

新しい動詞が必要な場合は、代わりにその動詞を名詞に変換することを検討してください。たとえば、「activate」を「activation」に、「validate」を「validation」に変換します。

しかし、あなたが書いたものから、あなたのアプリケーションにはもっと大きな問題があると思います。

「パラメータ」と呼ばれるリソースが提案されるときはいつでも、それはすべてのプロジェクトチームメンバーの心に赤信号を送信する必要があります。「パラメータ」は文字通りあらゆるリソースに適用できます。十分に具体的ではありません。

「パラメータ」は正確には何を表していますか?おそらくいくつかの異なるものがあり、それぞれに専用のリソースが必要です。

これを理解する別の方法-エンドユーザー(おそらくプログラミングについてほとんど知らない人)とアプリケーションについて話し合うとき、彼ら自身が繰り返し使用する単語は何ですか?

これらは、アプリケーションを設計する際の言葉です。

見込みユーザーとのこの変換をまだ行っていない場合は、今すぐすべてを停止し、完了するまで別のコード行を記述しないでください。そうして初めて、チームは何を構築する必要があるかを理解できます。

私は金融ソフトウェアについて何も知りませんが、推測しなければならない場合、一部のリソースは「レポート」、「支払い」、「振替」、「通貨」などの名前で表示されると思います。

ソフトウェア設計プロセスのこの部分については、多くの優れた書籍があります。私がお勧めできる2つは、ドメイン駆動設計分析パターンです。


1
これは本当に良い点です。正式なロジックと推論を処理するための心構えがあると、見落としがちです。有効な方法で他のパーツと適合する限り、Xが何であるかは関係ありません。人的要因は、すぐに消え去ります。
ブルトン語

1
単語を「アクティベーター」や「バリデーター」のような「処理リソース」に変換すると便利な場合があります。RFC 2616に従って、POSTを使用して「データブロックをデータ処理プロセスに提供する」
Darrel Miller

わかった。この場合、ユーザーはデータを「パラメーター」(または「リスクパラメーター」など)と呼びます。パラメーターのリストにはさまざまなタイプの設定が含まれていますが、パラメーターは常にセット全体として(CSVファイルで)アップロードされます。
マーカスレオン

@マーカス-それは非常に珍しいケースのように聞こえます。アプリの機能を詳しく説明していただければ、リソースを特定するためのより良い提案を提供できるでしょう。
リッチアポダカ

1
「エンドユーザーとアプリケーションについて話し合うとき、エンドユーザーが繰り返し使用する言葉は何ですか?」...そして、それらがすべて動詞である場合はどうなりますか?XD
アマルゴビナス

11

URLの設計は、アプリケーションがRESTfulかどうかとは関係ありません。したがって、「RESTful URL」というフレーズは意味がありません。

RESTが実際に何であるかについて、もう少し読む必要があると思います。RESTはURLを不透明として扱い、動詞や名詞などがあるかどうかにかかわらず、URLの内容がわかりません。URLを設計することもできますが、それはRESTではなくUIに関するものです。

そうは言っても、あなたの質問に行きましょう:最後の2つのケースはRESTfulでなく、いかなる種類のRESTfulスキームにも適合しません。これらは、RPCと呼ばれるものです。RESTを真剣に考えている場合は、アプリケーションが最初からどのように機能するかを再考する必要があります。それか、RESTを放棄して、RPCアプリとしてアプリを実行するだけです。

うーん多分そうではない。

ここでの考え方は、すべてをリソースとして扱う必要があるため、一連のパラメータに参照可能なURLが設定されたら、次のコードを追加するだけです。

GET [parametersurl]/validationresults

POST [paramatersurl]
body: {command:"activate"}

しかし、繰り返しになりますが、このアクティブ化はRESTではなくRPCです。


ここで興味深い点を述べます。このようなものに対するRESTfulなアプローチがどのようになるかをもう少し詳しく説明できますか?
poezn

私はここで回答を読むのに少し時間を費やしましたが、正義が何かにかかっているのではないかと思います。彼はパラメーターオブジェクトの個々のプロパティを個別のリソースとしてモデル化し、PUT動詞を使用してそのリソースのそのプロパティの内容を置き換えます。これは、各オブジェクトの状態をリソースのコレクションとしてモデル化し、状態の変更をリソースの配置、削除、または変更として行います。検証については-上記の私の回答のように、パラメーターが有効かどうかを魔法のように示すリソースが必要です。副作用がない限り、問題ありません。
ブルトン語

もちろん、「アクティブ化」が行うことは、単一のプロパティをtrueに設定することだけです。それが他に何をする必要がある場合でも、それはまだRESTfulでなく、どのようにRESTfulにモデル化したかわかりません。
ブルトン語

最後の2つのケースがRESTfulでないとは言えません。実際には、アクティブ化と検証は、リソースが状態マシンの新しい状態に変化していることを示す間接的な方法にすぎません。RESTはこれをモデル化するのに非常に適しています。
Darrel Miller、

@ダーレル、RESTに慣れていない多くの人にとっては難しいかもしれないRESTの一部を指摘していると思います。「Validate resource x」操作を実装するにはどうすればよいですか?難しいのは、状態が変化する可能性のある操作ですが、新しい状態は、要求が行われた結果です。
Sean

6

アクティブ化と検証の要件は、リソースの状態を変更しようとしている状況です。注文を「完了」したり、その他のリクエストを「送信」したりするのと同じです。これらの種類の状態変化をモデル化する方法は多数ありますが、同じ状態のリソースのコレクションリソースを作成し、コレクション間でリソースを移動して状態に影響を与えることがよくあると思います。

たとえば、次のようなリソースを作成します。

/ActiveParameters
/ValidatedParameters

パラメータのセットをアクティブにする場合は、そのセットをActiveParametersコレクションに追加します。次のように、一連のパラメータをエンティティ本体として渡すか、URLをクエリパラメータとして渡すことができます。

POST /ActiveParameters?parameter=/Parameters/{Id}

/ ValidatedParametersでも同じことができます。パラメータが無効な場合、サーバーはリクエストに「Bad Request」を返し、検証されたパラメータのコレクションにパラメータを追加できます。


1

以下のメタリソースとメソッドを提案します。

パラメータをアクティブにしたり、検証したりします。

> 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': '...'}
< }
<

私が理解している限り、問題は、機能ではなく、残りのURLの名前付けについてですよね。
poezn 2009年

2
「RESTful URL」に限定された質問は悪い質問であり、答えるべきではありません。代わりに、「関連するメソッドとURLを含むRESTfulなリソース」を検討するために質問を拡張し、そのように回答する必要があります。
yfeldblum

私が理解しているように、問題はURLの命名規則、名前付きリソースが応答する必要のあるHTTPメソッドに関するものでした。
Andrey Vlasovskikh、2009年

1

10年以上経過した後、OPで要求されているようなものをRESTアーキテクチャーでどのように設計できるかについての答えが実際にはないので、少し悲しいです。

まず最初に、RESTとは何ですか?頭字語RESTまたはReSTは「Representational State Transfer」の略で、リソースの状態の交換を特定の表現形式で定義します。表現形式は、ネゴシエートされたメディアタイプに対応しています。以下の場合にapplication/html表現形式HTMLのストリームは、おそらく特定の場所で特定の要素を配置するフォーマットいくつかのスタイルシートを適用した後、ブラウザに表示されるテキストコンテンツをフォーマットすることができます。

RESTは原則として、私たちが知っているブラウズ可能なWebを一般化したものですが、ブラウザーだけでなくあらゆる種類のアプリケーションを対象としています。したがって、設計上、Webに適用されるのと同じ概念がRESTアーキテクチャにも適用されます。「RESTful」な方法で何かを達成する方法のような質問は、Webページで何かを達成する方法の質問に答えてから、同じ概念をアプリケーション層に適用することで解決します。

通常、Webベースの計算機は、入力したデータをサーバーに送信する前に計算する値を入力できる「ページ」から開始する場合があります。HTMLでは、これは通常<form>、設定可能なパラメーター、要求の送信先のターゲットの場所、および入力データの送信時に適用する表現形式についてクライアントに教えるHTML 要素によって実現されます。つまり、次のようになります。

<html>
  <head>
    ...
  </head>
  <body>
    <form action="/../someResource" method="post" enctype="application/x-www-form-urlencoded">
      <label for="firstNumber">First number:</label>
      <input type="number" id="firstNumber" name="firstNumber"/>

      <label for="secondNumber">Second number:</label>
      <input type="number" id="secondNumber" name="secondNumber"/>

      <input type="submit" value="Add numbers"/>
    </form>
  </body>
</html>

上記のサンプルは、ユーザーまたは他のオートマトンによって入力できる2つの入力フィールドがあり、送信入力要素を呼び出すと、ブラウザーが入力データを送信されるapplication/x-www-form-urlencoded表現形式にフォーマットすることを処理することを示していますPOSTこの場合、指定されたHTTPリクエストメソッドを介して上記のターゲットの場所に送信されます。私たちが入力した場合1firstNumber、入力フィールドと2secondNumber入力フィールド、ブラウザは、の表現を生成しますfirstNumber=1&secondNumber=2し、ターゲットリソースへの実際のリクエストのボディのペイロードとしてこれを送ります。

したがって、サーバーに発行された生のHTTPリクエストは次のようになります。

POST /../someResource
Host: www.acme.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
Accept: application/html

firstNumber=1&secondNumber=2

サーバーは計算を実行し、クライアントがこの形式を理解していることを要求が示しているので、計算の結果を含む追加のHTMLページで応答します。

ブルトンがすでに指摘したように、「RESTful」なURLやURIなどはありません。URI / URLは独自の種類のものであり、クライアント/ユーザーに意味を伝えるべきではありません。上記の計算機サンプルでは、​​ユーザーはデータをどこに送信するかを単に興味がありませんが、送信入力フィールドをトリガーするとリクエストが送信されることに興味があります。タスクを実行するために必要なすべての必要な情報は、サーバーによってすでに提供されているはずです。

ブラウザはまた、リクエストが実際に計算機にいくつかの入力パラメータを供給していることを認識していない可能性があります。これは、注文プロセスを続行するために次のフォーム表現のみを返す注文フォームの場合もあれば、まったく異なる種類の場合もあります。資源。そのような場合にHTML仕様が要求することを実行するだけで、サーバーが実際に何をしているのかを気にすることはできません。このコンセプトにより、ブラウザは同じ表現形式を使用して、好みのオンラインショップからの注文、親友とのチャット、オンラインアカウントへのサインインなど、あらゆる種類のことを実行できます。

通常はボタンとしてレンダリングされる送信入力フィールドの場合など、特定の要素のアフォーダンスは、それをどうするかを定義します。ボタンやリンクの場合、基本的にそれをクリックするように指示します。他の要素は異なるアフォーダンスを伝えるかもしれません。このようなアフォーダンスは、リンク関係を介して表現することもできpreloadます。つまり、ユーザーが次のコンテンツを取得する可能性が最も高いため、リンクされたリソースのコンテンツをバックグラウンドで既にロードできることをクライアントに基本的に伝える注釈付きリンクを使用して表現できます。もちろん、このようなリンク関係は標準化するか、Webリンクで定義されている関係タイプの拡張メカニズムに従う必要があります。

これらはWebで使用される基本的な概念であり、RESTアーキテクチャでも使用する必要があります。"Uncle Bob" Robert C. Martinによれば、アーキテクチャーは意図的なものであり、RESTアーキテクチャーの背後にある意図は、サーバーをクライアントから切り離して、サーバーがクライアントを壊すことを恐れずに自由に進化できるようにすることです。残念ながら、カップリングを導入したり、クイックフィックスソリューションを追加して作業を完了したりするのは非常に簡単であるため、多くの訓練が必要です。Jim WebberがRESTアーキテクチャで指摘したように、サービスプロバイダーは、70年代のテキストベースのコンピューターゲームと同様のドメインアプリケーションプロトコルを設計して、クライアントがプロセスの最後に到達するまで追跡する必要があります。

残念ながら、いわゆる「REST」APIの多くは、残念ながら実際には何もしていません。API固有の外部ドキュメントで指定されている、主にJSONベースのデータの交換が表示されますが、その場で動的に統合することは通常困難です。リクエストがどのように見える必要があるかの形式も外部ドキュメントにハードコードされているため、事前定義されたtyp返す URIを解釈する多くの実装につながります。事前に交渉される一般的な表現形式を使用する代わりに。これにより、クライアントが事前定義されたURIの特定のデータ形式(表現形式ではないことに注意してください!)を受け取ることを期待するため、サーバーが変更されるのを防ぎます。「データ形式」は通常特定のAPIに対応しているため、このカスタムデータ形式の交換により、クライアントが他のAPIとやり取りすることがさらに防止されます。最近、Peppolがデフォルトの転送プロトコルとしてAS2をAS4に置き換えることによって再びそれに移行したとしても、Corba、RMI、SOAPなどのRPCテクノロジから過去のこの概念を知っています。

実際に尋ねられる質問に関しては、データをcsvファイルとして送信することは、application/x-www-form-urlencoded表現または類似のものを使用することと何の違いもありません。ジムウェバーは、結局のところ、HTTPは単なるトランスポートプロトコルであり、そのアプリケーションドメインはWebを介したドキュメントの転送であることを明らかにしました。クライアントとサーバーは、少なくとも両方ともRFC 7111でtext/csv定義されているようにサポートする必要があります。このCSVファイルは、リクエストを送信するフォーム要素、ターゲット要素、または属性を定義するメディアタイプと、設定のアップロードを実行するHTTPメソッドを処理した結果として生成される可能性があります。

HTMLHALフォームhalformionHydraなどのフォームをサポートするメディアタイプがいくつかあります。ただし、現在、入力データをtext/csv直接自動的にエンコードできるメディアタイプを認識していないため、IANAのメディアタイプレジストリで定義および登録する必要がある場合があります

完全なパラメータセットのアップロードとダウンロードは、私が推測する問題ではないはずです。前述のように、クライアントはURIを使用して新しいコンテンツを取得して処理するため、ターゲットURIは関係ありません。営業日によるフィルタリングも難しくありません。ただし、サーバーは、クライアントが選択できるすべての可能性を備えたクライアントである必要があります。近年、GraphQLとRestQLが進化し、特定のエンドポイントをターゲットにしてフィルタリングされた応答を取得できるSQLのような言語が導入されました。ただし、本当のRESTの意味では、これはRESTの背後にあるアイデアに違反します。a)GraphQLは、単一のエンドポイントのみを使用して、何らかの理由でキャッシュの最適な使用を妨げ、b)利用可能なフィールドの知識を必要とするため、クライアントの結合の導入につながる可能性があります。リソースの基本データモデルに。

特定の構成パラメーターをアクティブ化または非アクティブ化するには、このアフォーダンスを提供するハイパーメディアコントロールをトリガーするだけです。HTMLフォームでは、これは単純なチェックボックスか、リストまたはその種類の複数行の選択です。フォームとそれが定義するメソッドに応じて、構成全体を送信するPUTか、行われた変更についてスマートになり、を介して部分的な更新のみを実行する可能性がありますPATCH。後者は基本的に、更新された表現への変更表現の計算を必要とし、現在の表現を目的の表現に変換するために必要な手順をサーバーに提供します。PATH仕様によれば、これはトランザクション内で実行する必要があるため、すべてのステップが適用されるか、いずれのステップも適用されません。

HTTPは、変更を適用する前に、サーバーが受信した要求を事前に検証することを許可および推奨します。以下のためのPUTスペックの状態:

オリジンサーバーは、PUT表現が、PUTによって変更できない、または変更されないターゲットリソースに対するサーバーの制約と整合していることを確認する必要があります(SHOULD)。オリジンサーバーがURIに関連する内部構成情報を使用してGET応答の表現メタデータの値を設定する場合、これは特に重要です。PUT表現がターゲットリソースと矛盾している場合、オリジンサーバーは、表現を変換するかリソース構成を変更してそれらを一貫させるか、表現が不適切である理由を説明する十分な情報を含む適切なエラーメッセージで応答する必要があります(SHOULD)。409(競合)または415(サポートされていないメディアタイプ)ステータスコードが推奨されます。

たとえば、ターゲットリソースが常に "text / html"のContent-Typeを持つように構成され、PUTで​​ある表現が "image / jpeg"のContent-Typeを持つ場合、オリジンサーバーは次のいずれかを実行する必要があります。

a。新しいメディアタイプを反映するようにターゲットリソースを再構成します。

b。新しいリソース状態として保存する前に、PUT表現をリソースの形式と一致する形式に変換します。または、

c。ターゲットリソースが「text / html」に制限されていることを示す415(Unsupported Media Type)応答でリクエストを拒否します。おそらく、新しい表現の適切なターゲットとなる別のリソースへのリンクが含まれます。

HTTPは、PUTメソッドがオリジンサーバーの状態にどのように影響するかを、ユーザーエージェント要求の意図とオリジンサーバーの応答のセマンティクスを超えて正確に定義していません。...

この投稿を要約すると、必須またはサポートされている入力パラメーター、リクエストを送信するターゲットの場所、使用する操作、およびメディアタイプをクライアントに教えることができる既存のメディアタイプを使用する必要があります。リクエストをフォーマットするか、IANAに登録する独自のリクエストを定義する必要があります。入力を次のように変換する場合は、後者が必要になることがあります。text/csv次に、CSV表現をサーバーにアップロードします。検証は、変更がリソースに適用される前に行う必要があります。実際のURIは、リクエストをどこに送信するかを決定する以外のクライアントに関連していてはならず、サービスの実装者であるあなたが自由に選択することができます。これらの手順に従うことで、いつでもサーバー側を変更できる自由が得られ、クライアントが使用されているメディアタイプをサポートしていれば、結果としてクライアントが壊れることはありません。


0

編集:確かに、URIはGETリクエストがべき等を維持することを防ぎます。


ただし、検証については、HTTPステータスコードを使用してリクエストの有効性を通知する(新しいパラメータを作成するか、既存の「パラメータ」を変更する)と、Restfulモデルに適合します。

400 Bad Request送信されたデータが無効であり、リクエストを再送信する前に変更する必要がある場合は、ステータスコードを報告してください(HTTP / 1.1ステータスコード)。

ただし、これは、ユースケースのように遅延させるのではなく、送信時に検証することに依存しています。他の答えには、そのシナリオに対する適切な解決策があります。


URIは識別子であることを意図しています。特定のURLを使用しても、副作用はありません。プロキシがそれで何をするか想像してみてください。
ブルトン語

2
またはグーグル、それについては。私はかつて、この種の馬鹿げたことのためにすべての製品がグーグルによって削除されたウェブストアについての話を読みました。
ブルトン語

0

REST環境では、各URLは一意のリソースです。あなたのリソースは何ですか?財務計算機には、明らかなリソースはありません。パラメータと呼んでいるものを詳しく調べ、リソースを引き出す必要があります。たとえば、ローンの償却カレンダーがリソースになる場合があります。カレンダーのURLには、開始日、期間(月または年単位)、期間(利息が複利計算される場合)、金利、および初期原則が含まれる場合があります。これらすべての値を使用して、特定の支払いカレンダーがあります。

http://example.com/amort_cal/2009-10-20/30yrsfixed/monthly/5.00/200000

さて、あなたが何を計算しているのかわかりませんが、パラメーターリストの概念はRESTfulに聞こえません。他の誰かが言ったように、上記の要件はよりXMLRPCに聞こえます。RESTを使用する場合は、名詞が必要です。計算は名詞ではなく、名詞に作用する動詞です。カルクから名詞を引き出すには、向きを変える必要があります。


5
ここでスラッシュを使用するのは少しばかげていると思います。amort_cal?date = 2009-10-20&type = 30yrsfixed&period = monthly&rate = 5.0&initialamount = 200000の何が問題になっていますか?RESTは、リソースである限り問題になりません。ただし、URI仕様重要です。このようなスキームで動作する相対リンクをどのように想像しますか?
ブルトン語

それでもあなたは良い点を育てます。これらの「パラメータ」はサーバーサイドに保存する必要があるのですか?それが1回限りの計算である場合は、URLにパラメーターがある仮想空間を単に作成しないでください。内部状態を変更しない限り、問題はありません。
ブルトン語

1
また、「パラメータ」は「リソース」には適用されません。リソースは、一意の識別子を持つ単一のエンティティです。私のURLは単一のリソースを識別します。パラメータ化されたURLは、パラメータを使用して選択したリソースのコレクションを示します。
jmucchiello 2009年

2
RESTは「CRUDing Resources」に基づいていません。すべての順列をリソースと呼ぶことができると思うので、すべてのクエリパラメータをパスセグメントに固定しても、RESTfulインターフェースは自動的には作成されません。残念ながら、システム内のリソースを特定するために適用できる魔法のプロセスはありません。機械式ではなく、注意深い設計が必要です。
Darrel Miller、

2
繰り返しになりますが、RESTアーキテクチャはURLの内容を考慮しません。URLは不透明であることを意図しています。スラッシュ、セミコロン、またはUnicodeハートをセパレーターとして使用するかどうかは、問題になりません。これを読んで、私が言っているとあなたが想像することではなく、これに応答してください。
ブルトン語
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.