0

RESTeasy と Seam を使用して、いくつかの Web サービスの開発に取り組んでいます。私が作成したいサービスの 1 つは、Query by Example サービスです。

私は最初に次のようにコーディングしようとしました:

@GET
@Produces("application/xml")
@Consumes("application/xml")
@Path("/matching")
public MessageList getMatchingMessages(Message msg);

残念ながら、これはクライアントに複雑さをもたらしました。

[testng] [Parser] Running:
[testng]   C:\Users\bdw\workspace-shepherd\GPRI\test-build\testng-Test.xml
[testng] java.lang.RuntimeException: java.lang.ClassCastException: org.apache.commons.httpclient.methods.GetMethod cannot be cast to org.apache.commons.httpclient.methods.EntityEnclosingMethod
[testng]    at org.jboss.resteasy.client.core.ClientInvoker.invoke(ClientInvoker.java:104)
[testng]    at org.jboss.resteasy.client.core.ClientProxy.invoke(ClientProxy.java:59)
[testng]    at $Proxy138.getMatchingMessages(Unknown Source)

等々。この方法のバリエーションでは、日付範囲を使用できますが、明らかに、次の形式でも機能しません。

@GET
@Produces("application/xml")
@Consumes("application/xml")
@Path("/matching")
public MessageList getMatchingMessages(@QueryParam("startDate") Date start,
        @QueryParam("endDate") Date end, Message msg);

考えてみると、Message を GET メソッドに渡すことは、REST の精神に違反している可能性があります。確かに、Consumes アノテーションをメソッドから削除すると、クライアントはこれらのエラーなしで実行できます。しかし、ここで疑問が生じます。非 URL ベースの XML 入力を受け取り、XML 出力を生成するクエリ メソッドを作成する正しい方法は何でしょうか? それとも、XML と URL ベースのパラメーターの両方を取り、XML 出力を生成しますか?

4

2 に答える 2

2

あなたの質問のコーディング面についてはお手伝いできませんが、URL 以外の入力を渡す場合は、GET よりも POST メソッドの方が適しています。実際には、例に一致するメッセージのリストである新しいリソースを作成しています。

于 2010-11-11T18:24:41.673 に答える
2

結果をキャッシュする必要があると思いますか? 答えが「いいえ」の場合は、代わりに POST を使用できます。

POST /QueryEngine
Content-Type: application/xml

=>
200 OK
Content-Type: application/xml

答えがおそらく結果をキャッシュしたい場合は、次のようにします。

POST /QueryGenerator
Content-Type: application/xml

=>
303 See Other
Location: /GeneratedQuery/2323

GET /GeneratedQuery/2323

以上のことをすべて言いましたが、XML を渡す代わりにクエリ パラメーターを使用することはできませんか?

于 2010-11-11T18:26:28.710 に答える