REST は Web の現在の機能を使用し、いくつかの原則を適用してより効率的にしています。通信には標準の HTTP 動詞を使用し、ステートレスな性質を利用します。
しかし、REST サービスが通信に TCP プロトコルを使用することは可能でしょうか? はいの場合、それはその原則に違反しますか?
HTTP は TCP/IP ベースのプロトコルです。したがって、REST を使用するときは、すでに通信に TCP を使用しています。しかし、HTTP を使用せずに純粋な TCP ソケットを介して REST を使用する場合は、いいえ、REST は HTTP 動詞とヘッダーに基づいているため、これは意味がありません。これらの概念は、HTTP プロトコルにのみ存在します。
わずかに異なる角度:
1. WCF を使用して REST ベースのサービスを作成しないでください。Asp.Net WebAPI を使用します。
2. 楽しみのために: 「REST」の原則を念頭に置いて WCF TCP バインディングを使用する場合は、典型的な RPC のようなものではなく、「リソース」に基づいてステートレス API を作成できます。
[ServiceContract]
interface RestApi
{
Result Get(string id);
Result Post(string id, Resource resource);
Result Put(string id, Resource resource);
void Delete(string id);
}
そうすれば、サービスごとに異なるコントラクトを定義する必要がなくなり、さまざまなやり取りに合わせてリソースを調整するだけで済みます。
注: 私は誰にもこれを行うように勧めているわけではありません: それは車輪の再発明です. REST が必要な場合は WebAPI を使用します。
Darin が既に回答したように、HTTP は、RESTful 定義で使用されているものとまったく同じオーバーヘッドを持つ TCP プロトコルです。いいえ、HTTP オーバーヘッドを取り除くことはできません。
あなたの質問「高速な RESTful アプリに TCP を使用できますか? 」という質問は、「 HTTP が純粋な TCP より遅いのに、なぜ多くの Web サイトが REST を使用しているのですか? 」という質問に関連していると思います。
実のところ、HTTP は確かに純粋なバイナリ TCP 形式よりも遅いですが、ほとんどのアプリケーションでは、オーバーヘッドが非常に小さく、通常、クライアントは 1 分間に数回のリクエストしか行わないため、ユーザーは違いに気づきません。
例えば:GET /posts?userId=5
このリクエストが完了するまでに数ミリ秒以上かかる場合、HTTP プロトコルに問題はありません。パフォーマンスの問題は、ネットワークの待ち時間、サーバー側のコード、またはデータベースからデータを取得する方法に関連しています。
REST ベースのサービスには、Http 以外のバインディングを使用できません。それは休息が、ある原則に基づいた建築様式だからです。この原則の 1 つは、Web のステートレス プロトコルである http を利用することです。また、TCP プロトコルでは使用できない Get、Port、Put、Delete などの HTTP ワードも使用する必要があります。