2011-11-25 17 views
15

RESTfulなWebサービスはすべて「すべてがリソースとして表現され、アドレス(URI)でアクセスできる」という神聖なアイデアを基にしているため、CRUDアプリケーションでは意味があります(例はすべてリスト作成/ /エンティティの削除)。しかし、CRUD操作とは何の関係もない単純な電卓RESTfulサービスを作成するなど、他のビジネスロジックについてはどうでしょうか? このようなRESTサービスにはどのような良い設計ができますか?RESTful電卓を作成するにはどうしたらいいですか?

第2に、SOAPのロジックがすでに完全な意味を持つ場合、REST over SOAPを使用することの本当のメリットは何ですか?

+0

を返しますので、正確にあなたの質問は何ですか? – paulsm4

答えて

13

電卓サービスは、RESTfulな方法でモデル化するのが簡単です。 "CRUD"の "R"は "read"を意味し、 "read"は "compute"を意味することはできません。だから、簡単なReverse Polish電卓サービスは、GETを介してアクセスすることができます

3 
4 
+ (URL-encoded as %2B) 

冪等、安全でキャッシュ可能なリクエストです:

GET https://calc.com/rpnCalc?3&4&%2B 
7 

単に上記のURIスキームは、GETリクエストへの3つのパラメータを追加します。これが計算に多大な時間を要した非常に複雑な数学クエリであった場合、これらのクエリをすぐに使用できるHTTPプロキシにルーティングし、同じURIを繰り返しクエリする必要がある場合は事前計算された値を即座に返すことができます。

必要な計算の種類によっては、非常に複雑なクエリをCalculatorリソースにPOSTすることもできます(クエリをリクエスト本体として渡すこともできます)。サーバはURIを "result"リソースに返す可能性があります結果を取得するためにGETすることができます。また、結果をページ分割することもできます。

第二に、SOAPの ロジックは、すでに完全な理にかなっている場合は、SOAP上でRESTを使用しての本当の利点は何ですか?

複雑なSOAPを構築することなく、curlのようなコマンドラインツールを使用して上記の電卓サービスにアクセスできます。サードパーティのXMLライブラリやSOAPツールキットを使用することなく、数秒で呼び出しをコーディングできます。 HTTPプロキシなどの商品ツールを使用して結果をキャッシュし、パフォーマンスを向上させることができます。 SOAPの相互運用性やWS-Iとの互換性を確認する必要はありません。ハイパーリンクを正しく使用すると、既存のクライアントに影響を与えたり、再コンパイルすることなく、サービスを進化させて改善することができます。私は何年にもわたって維持しなければならない脆弱な契約やWSDLはありません。クライアントはすでにGET/PUT/POST/DELETEが何をしているのかを知っているので、セマンティクスを再定義する必要はありません。 XMLの代わりにJSONを使用することを希望するAPIクライアントは、HTTPの組み込みコンテンツネゴシエーション機能を使用して取得できます。 SOAPとWebサービスでは、ゼロを絶対に行うことができます。

ねえ、SOAPがあなたのニーズに合っているなら、それを持ってください。 RESTの使用には多くのメリットがありますが、状況によっては適切でない場合があります。少なくとも、RESTがまともな本like this oneであなたに与えることができることを学び、完全な話を得た後であなたの心を作りましょう。

+0

ブライアンありがとう!したがって、メソッドを(サブ)リソースとしてモデル化することもできますが、「GET https://calc.com/arithmeticCalc/add?a=3&b=4」と書くことはできますか? – karimyafi

+2

はい、あなたのURI構造に動詞を追加しないでください。あなたはすでにHTTPの中に動詞を持っているので、名詞を使って自分のURI内のリソースを記述するだけでよいのです。そうすれば、APIクライアントは各リソースの使い方を混同することはありません。あなたが '/ add'リソースに対してHTTPの' POST'を実行したとしたら、実際に追加を行うのかサブリソースを作成するのかはどうすれば分かりますか?あなたの例での混乱を避けるため、 'calc.com/arithmeticCalc/adder?a = 3&b = 4'に少し変更します。 –

2

これは、RESTの名詞と動詞の間の緊張の良い例です。リソースとして「追加」または「加算」を使用することの提案は、非常に素朴です。それは、各演算が「加算器」または「減算器」へのGETとして行われることを意味します。もちろん、リソースを「計算する」ことができますが、動詞を使用しています。私たちは名詞である "電卓"や "答え"に変更することができますが、実際には何も役に立ちませんでした。

19

HTTP POSTは、必ずしも永続リソースを作成する必要はありません。 RFC 2616, section 9.5で私達は見つける:

をPOSTメソッドによって実行されるアクションは、URIで識別することができ、リソース につながるしない場合があります。この場合、 に結果を記述するエンティティが含まれているかどうかによって、200(OK)または204 (No Content)のいずれかが適切な応答ステータスになります。

これは、計算の結果を自分のURLに保存しなくても、「計算を作成する」と考えることができます。あなたのAPIは、次のようになります。

Request: 
POST /calculations 
Content-Type: text/plain 

3 + 3/12^(3 * PI) 

Response: 
200 OK 
Content-Type: text/plain 

3.005454 

これは、あなたが制限された長さを持つクライアントまたはプロキシ経由で長い計算を提出しようとすると壊れるURLを介して、「コンテンツ」を渡していない利点を持っていますURLのまた、要求と応答について異なる表現をサポートすることもできます。

3

この質問は2歳です。しかし、私と私の同僚の多くを混乱させる疑問が残っているようです。私たちは皆を満足させるソリューションに到達することができませんでした。

しかし、単純な計算のために、私は以下のJAXRS実装がきれいなAPIを提供していと思います。そのようなimplementionで

/** 
* This class defines a CalculatorResource. 
*/ 

@Path("v{version}/calculators/{id}") 
@Named 
public class CalculatorResource { 

    private final Long value; 

    public CalculatorResource() { 
     value = 0L; 
    } 

    public CalculatorResource(Long initialValue) { 
     this.value = initialValue; 
    } 

    @GET 
    public Long getValue() { 
     return value; 
    } 

    @Path("+{value}") 
    public CalculatorResource add(@PathParam("value") Long value) { 
     return new CalculatorResource(this.value + value); 
    } 

    @Path("-{value}") 
    public CalculatorResource subtract(@PathParam("value") Long value) { 
     return new CalculatorResource(this.value - value); 
    } 

    @Path("*{value}") 
    public CalculatorResource multiply(@PathParam("value") Long value) { 
     return new CalculatorResource(this.value * value); 
    } 

} 

、URIは以下の式を読みやすくすることができます。

例:/API/V1 /電卓/ mycalc/+ 9/-4/* 3/+ 10 は25

関連する問題