1

RESTEasy で Java と JBoss7 を使用しています。サービスをテストするために、RESTful サービスとクライアントを作成しました。

ClientRequest request = new ClientRequest(
         "http://localhost:8080/test/rest/cars");
request.accept(MediaType.APPLICATION_XML);

String input = "<car><carId>10.99</carId><carName>Ford</carName></car>";

request.body(MediaType.APPLICATION_XML, input);
ClientResponse<String> response = request.post(String.class);
System.out.println("Output from Server .... \n");
System.out.println(response.getStatus());

これは完璧に機能します!ここでの唯一の問題はクライアントにあります。String input = "<car><carId>10.99</carId><carName>Ford</carName></car>";クライアントは私が持っているオブジェクトを持っていないので、ご覧のようにハードコーディングされた XML を送信する必要があります。

クライアントは get メソッドから受け取った XML 表現を模倣しますが、これは大規模で複雑なリソースでは困難な場合があります。

  • クライアントが送信したいオブジェクトの正しい構造を知る方法はありますか、それとも型付き XML を送信する必要がありますか?

  • WSDL や XSD に似たもの、または REST の制約に反するものをクライアントに与えることはできますか?

  • 私は、人々が Xsteam とアンマーシャリングを使用するソリューションを見てきましたが、それらはクライアントがリソースのクラス表現を持っていると想定しています。

4

1 に答える 1

1

クライアント コードに XML メッセージをハードコーディングしないでください。XML は、サービスとクライアントの間でやり取りされるものです。

仮に、同じサービスを別の場所に公開していて、一方が XML 形式のみを理解し、もう一方が JSON のみを理解する状況を考えてみましょう。ハードコーディングされたメッセージでクライアントを使用する場合は、XML を話すサービスのみを呼び出すことができます。REST はリソースの表現に関するものであることを忘れないでください。

クライアントは私が持っているオブジェクトを持っていないためです。クライアントは get メソッドから受け取った XML 表現を模倣しますが、これは大規模で複雑なリソースでは困難な場合があります。

クライアントが送信したいオブジェクトの正しい構造を知る方法はありますか、それとも型付き XML を送信する必要がありますか?

クライアントは、通常はオブジェクトを操作する Java アプリケーションであると考えてください。オブジェクトはリソース (例: car) を表し、クライアントが内部で使用するものです。

サービスを呼び出すときは、これらのオブジェクトを XML にマーシャリングするだけです。サービスが応答すると、XML をオブジェクトに非整列化します。

Accept使用されるおよびヘッダーに基づいてContent-Type、適切なマーシャラー/アンマーシャラーを選択するだけです。その後、何かを XML として送信し、JSON として受信することもできます。

確かに、RESTeasy クライアントはサービス側と同じアノテーションを利用でき、サービスとクライアントの間で一部の Java タイプ (クラス) を再利用することさえ可能ですが、クライアントが他のテクノロジーで記述されている場合、それらの Java クラスは役に立たなくなります。 :C#、Python、C++など

サービスが使用する型をクライアントが気にする必要があるのはなぜですか? 表現のみを気にする必要があります。内部的には、クライアントは (サービスに関係なく) 必要な型を使用でき、サービスと対話するときは適切な表現で通信できます。

クライアントに WSDL や xsd に似たもの、または REST の制約に反するものを与えることはできますか?

これは少しトリッキーになります。

REST は、分散システムを構築するためのソフトウェア アーキテクチャ スタイルです。残念ながら、この「スタイル」の理解は人によって異なります。その結果、使用するメソッド、URL、および転送する「タイプ」を単純に記述する、いわゆる RESTful API が大量に存在します。

これは、Roy T. Fielding 自身が強調しているように、REST を行う間違った方法です。REST API はハイパーテキスト駆動型でなければなりません

RESTful クライアントは、アクセスする URL や通信に使用する「タイプ」について事前に知っておく必要はありません。交換で使用されるメディア タイプを理解することだけが必要です (application/xmlメッセージの形式について何かを述べているだけで、内容についての意味や説明はありません)。

その結果、なぜサービスは WSDL を提供する必要があるのでしょうか? 実際には (WSDL 2.0 は RESTful サービスを記述することができますが)、実際にはWADLについて話しているのです。しかし、REST コミュニティは実際には WADL について考えていないため、これも「スタイル」の問題です

「本に従って」RESTを行っている場合、WADLは必要ありません。実際に HTTP ベースのインターフェースしか持っていない場合は、WADL を提供して、クライアントを開発するときに他のプログラマーの負担を軽減できると思います。

私は、人々が Xsteam とアンマーシャリングを使用するソリューションを見てきましたが、それらはクライアントがリソースのクラス表現を持っていると想定しています。

RESTeasy は JAXB マーシャリングをサポートしているため、ほとんど労力をかけずに動作するはずです。

于 2013-02-16T18:16:43.873 に答える