REST vs RESTful vs「通常の」Webサービス-同じかどうか


21

RESTやRESTfulアプリケーションに関する定義と議論をいくつか読みましたが、それが本当の意味をまだ理解していません。

私は通常、GETを介してデータを取得するか、POSTを介してデータベースからデータを取得するかデータベースに書き込むWebサービス(通常はPHPスクリプト)にデータを送信するアプリを使用します。

さて、これはRESTfulアプリですか?そうでない場合、RESTfulアプリはどうなりますか?RESTfulコンセプトとこれまでに取り組んだコンセプトの違いは何ですか?例で説明してください。

また、誰かがRESTについて話し、誰かがRESTfulアプリについて話します。RESTという用語は理論的な概念を指すのに対して、特定のアプリについて話すときにはRESTfulが使用されることがわかりました。これは正しいのですか、それともRESTアプリとRESTfulアプリの間に本当の違いがありますか?


1
すべてのサーブレットを作成して、GETまたはPOSTパラメーターからのみ情報を取得できる場合(呼び出し前にローカルに保存されるものはまったくありません)、RESTを適切に適用しています。言い換えると、サーバーは、MVCでモデルの役割を果たし、制御されず、与えられたものを使用して何らかのタスクを実行します。それがもう少し良く説明することを願っています。
ニール

@Neil私は反対側にいます-モバイルアプリ。Webサービスを使用し、POSTおよびGETを介してWebサービスと通信するクライアントです。すべてのWebサービスは他の誰かによって構築されており、私がしたことはそれらを使用することだけでした。しかし、用語は私を混乱させました。したがって、HTTPチャネルとHttpGet / HttpPostオブジェクトを使用している場合、RESTfulアプリを処理していますか?
-deviDave

必ずしも。サーバーがいくつかの制約に違反する可能性があるため、サーバーの実行方法がわからなければ、RESTfulアプリかどうかを知る方法はありません。とはいえ、一貫した結果を返す場合、おそらくRESTfulです。
ニール

@ニールああ、私は今得ます。RESTfulはサーバー上で実行されます。そして、リクエストごとに投稿オブジェクトを送信する場合(各パラメーターを個別に送信するのではない)、おそらくRESTアプローチです。クライアント(モバイルアプリ)に関しては、コーディングが同じであるため、RESTであるかどうかは関係ありません。私はそれを正しくしましたか?
-deviDave

2
RESTfulはサーバーとクライアントの両方ですが、クライアントのみが表示される場合は、クライアントが制約に従っているかどうかしかわかりません。それだけです。RESTの意味は、ログインする必要がある場合は、ユーザー名とパスワードを投稿することです。サーバーはログインを検証し、ユーザーハッシュキーをデータベースに保存して返します。これで、ログインが必要な操作を行う必要があるときはいつでも、常にユーザーハッシュキーを渡します。サーバーはログインしたことを「忘れ」ますが、ユーザーハッシュを使用してログイン状態を検証します。RESTfulでない場合、サーバーはログインしたことを記憶します。違いを理解しますか?
ニール

回答:


13

RESTfulなアプリケーションの重要な属性は次のとおりです。すべての通信は経由でHTTPのGET、POST、PUT、DELETE すべての項目は、フォームの標準URLを介してアドレス指定されてhttp://your.site.com/salesapp/salesperson/0000001/detailsいないパラメータなどのURLを識別事GETとつまり純粋なURL 、POST、PUT、DELETEは、あなたがそれに対して何をしたいかを識別します。

これを行う主な理由は、ロードバランシング、フェイルオーバーなどが可能なステートレスサービスが自動的に得られることです。

スキームが非常にシンプルであるため、非常にクリーンなインターフェイスが実現し、特定のバックエンド実装からクライアントが完全に切り離されます。


ああ、今のところPUTやDELETEを使用していません(モバイルアプリは通常GETとPOSTのみを実行します)が、これは実際に私がやったことや、今やっているように見えます。クライアントがREST *の用語を使用せず、むしろ「Webサービス」と「PHPスクリプト」を使用しただけです
-deviDave

2
ジェームズ、クエリパラメータを避ける理由を説明してください。たとえば、誤った階層を導入することなく、特定の方法でリソースをフィルタリングすることをどのように表現できますか?
ゲイリーロウ

3
@GaryRowe:URL(パラメーターなし)は、操作するリソースを識別します。引き続きパラメーターを使用できますが、これらはリソースの識別には使用されません。たとえば、ディレクトリ(/で終わるURL)に対するGETは、ディレクトリ内のリソースのリストを返す必要があります。URLのパラメーターを使用して、フィルターまたは並べ替え順序などを指定できます。
マーティンヨーク

1
ありがとう、ロキ。ジェームズは、誤解を招く可能性のある状況下ではクエリパラメータの使用を許可していないように見えるため、回答を編集することをお勧めします。実際、ディレクトリ内のリソースのリスト自体がその概念を表現するリソースであるという興味深い観察があります。
ゲイリーロウ

RESTでは、アプリがURLベースである必要はなく、GET、POST、DELETEなどの動詞を持つ必要もありません。ただし、WebAppの場合、URLが唯一のオプションであり、前述の動詞です。
ナワズ

6

RESTはRepresentational State Transferの略です。ソフトウェアがREST制約に準拠している場合、RESTfulと見なされます。

今、ウィキペディアから恥知らずにリッピングしたので、これは本当にどういう意味ですか?これは、GET、POST、PUT、DELETEなどの組み込みのHTTPコマンドを使用して、クライアントとサーバー間でやり取りすることを効果的に意味します。

あなたがしていることは、RESTFulアプリのように聞こえます。ただし、適切に設計されたパイルとジャンクRESTFul Webサービスの山には大きな違いがあります。たとえば、GETのもう一方の端にあるPHPコードは状態変更を実行する場合がありますが、GETは読み取り専用操作と見なされるため、これは間違っていると見なされます。POST(新規)とPUT(置換)の使用方法にも微妙な違いがあります。

これに関するウィキペディアの記事は実際には本当に良いので、ここでやめます。


ここまでは、GET(HttpGet)を使用してコンテンツを取得し、POST(HttpPost)を使用してデータベースのコンテンツを入力/変更しました。これをパラメーターとしてHttpPostに送信し、Webサーバー上のPHPスクリプトがこれらのパラメーターをSQLコードに変換しました。これはRESTfulアプリですか?私は、PHPスクリプトがどの程度うまく機能しているかではなく、概念に興味があります。私はそれをしていません。
-deviDave

2
常にPOSTを使用するよりも慣用的なRESTであるコンテンツを置換する場合のPUTの使用を調査します。
マルティンヴェルブルク

はい、そのような場合はPUTを使用します。
-deviDave

GETを正しく実装する必要があることに注意してください(つまり、べき等です)。初期のこのような基本的なエラー。
ゲイリーロウ

@deviDaveまた、リソースの一部を更新するために設計されたPATCHを調べることもできます。Martinが正しく指摘しているように、PUTはリソース全体を置き換えるためのものです。
ゲイリーロウ

4

先に進む前に、この関連する質問が役立つ場合があります

RESTとRESTfulの違いは、単にセマンティクスです。RESTは、クライアントとサーバーの関係に適用されるアーキテクチャスタイルです。RESTfulは、RESTを使用していることをクライアントに伝える方法です。

多くのWebアプリケーションはRESTfulであると主張していますが、実際にはREST制約に部分的にしか準拠していません(Martijn Verburgも彼の答えで言及しているように)。ここにリストしますが、記事を読むことを強くお勧めします。

  • クライアントサーバー
  • キャッシュ可能
  • 階層化システム
  • オンデマンドのコード(オプション)

クライアント側で作業していると述べているので、RESTアーキテクチャが接続クライアントとしてあなたに何を与え、何を期待しているのかを見ると役立つかもしれません。RESTはHTTPではありませんが、RESTをサポートする最も人気のあるプロトコルであるため、これを中心に例を示します。

クライアントは次のことを期待されます。

  • HTTP動詞(GET、POST、PUT、DELETE、OPTIONS、PATCHなど)を使用して、関連する操作を実行します
  • Acceptヘッダーを提供し、Content-Typeヘッダーを理解します(たとえば、これまでに見たことのないXMLを受け取りますが、参照されたXSDを使用して、ユーザーに提示するクライアント側ドメインモデルを作成できます)
  • 理解できるContent-Typeで提供されているリンクをたどります(たとえば、ユーザーまたはアプリケーションに<link rel="pay" href="http://example.org/orders(1)/payment">、HTMLで状態遷移を表現し、クレジットカード番号などの支払いの詳細を表すXMLを含む本文を含むPOSTを通じて支払いリソースを作成することを推測させます) 、量など)
  • 広範囲のHTTPステータスコードに正しく反応する

上記を行う場合、RESTクライアントと考えることができます。「RESTfulアプリ」と呼ぶこともできますが、それは、クライアント側でRESTを使用していることを意味します。用語。


3

RESTfulは、インターフェースがオブジェクトのセットであり、読み取りおよび更新(および削除)が可能なことを意味します。つまり、マルチパラメータークエリはありません(パラメーターのみが読み取りたいオブジェクトです)。サーバー上の何かを変更する操作は1種類のみで、新しい状態のアップロードです。

これらの制限により、すべてのリクエストがべき等であることが保証されます(リクエストを複数回送信しても、1回送信しても余分な影響はありません)。これは重要です。ネットワークはいつでも失敗し、リクエストやレスポンスを配信できない可能性があり、requests等リクエストでは再度送信するだけで、複雑な回復を行う必要がないためです。


第1段落に賛成票を投じてください。とても簡潔。ありがとう!
-deviDave

もう1つ、正しいことを確認します。私(私のアプリ)がRESTサービスのクライアントである場合、クライアントとして私は、コーディングが常に同じであるため(httpget、httppostなど)、サービスがRESTfulであるかどうかを判断しませんか?この原則は、サーバースクリプト/アプリの所有者にのみ関係しますか?
-deviDave

RESTは、インターフェイスのセマンティクスを設計するためのガイドラインです。基盤となるテクノロジーは、インターフェースがRESTfulであるかどうかに関係なくHTTPです(ただし、XML-RPCやSOAPなどの他のレイヤーはRESTfulインターフェースには関係ありません)。したがって、常に同じhttpget、httppostなどを使用します。
ジャン・ヒューデック

さらに、SMTPはRESTfulインターフェイスです。GET、PUTなどとは異なる動詞、異なる基になるプロトコルを使用しますが、概念は同じです。dem等動詞ベースのコマンドをサーバーに送信します。
gbjbaanb

すべてのRESTリクエストがi等というわけではありません。たとえば、POSTを複数回発行すると、多くの新しいリソースが発生します。
ゲイリーロウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.