0

これがサーバー側のコードです。クライアント側でパスをどのように定義するかについて質問があります。これはサーバー上のメソッドです

@Path("{index}/{product}/{amount}")
@PUT
@Produces("text/plain")
public String editTable (@PathParam("index") Integer index, @PathParam("product")     String product, @PathParam("amount") Integer amount)
{...}

今クライアント側で

{url = new URL( "http://localhost:8080/OrderService/service/tableservice/"+num+"/"+product+"/"+amount);
.....}

/ "+ num +" / "+ product +" / "+ amount);

これは正しい構文ですか?

また、製品が文字列である間、numとamountを整数にすることはできますか、それとも問題が発生しますか?

4

2 に答える 2

0

いずれか@QueryParamを整数にマッピングする場合は、次の点に注意してください。Oracleドキュメント
リンクから:

If a query parameter exists in the query component of the request URI, then the value will be extracted and parsed as a 32–bit signed integer and assigned to the method parameter. If the value cannot be parsed as a 32–bit signed integer, then an HTTP 400 (Client Error) response is returned.

安全のために、あなたindexamountとして持ってくださいString。それらをサービス内で整数に解析し、HTTP400NumberFormatExceptionの代わりに処理します。

于 2013-01-12T13:25:39.543 に答える
0

製品名に「安全でない」URL文字が含まれていると、問題が発生します。おそらくそうなるでしょう。これを回避するには、名前をURLに追加する前にURLエンコードすることができます。

しかし、そもそもPATHの定義を考え直すべきだと思います。優れたリソースエンドポイントは、それを一意に識別する必要があります。しかし、あなたの場合amount、URLにフィールドを含めています!つまり、製品を注文している人に応じて、リソースのURLが変更されます。

顧客Aは2つのファービーを注文します:

/OrderService/service/tableservice/9/Furbies/2

顧客Bは1つのファービーを注文します

/OrderService/service/tableservice/9/Furbies/1

しかし、どちらの場合も、顧客は同じもの、つまりファービーを注文しようとしています。これはRESTfulではありません。代わりに、一意のリソースエンドポイントを定義してから、追加の注文情報を追加データとして送信する必要があります。したがって、たとえば:

public class Order {
    private Integer productId;
    private Integer amount;
}

@PUT
@Path("/{productId}/orders")
@Produces("text/plain")
public String updateOrder(@PathParam("productId"), Order order) { ... }

インデックスフィールドも削除したことに気付くでしょう。どうしても必要な場合は、インデックスフィールドを追加し直すことができます。ordersURLの末尾に接尾辞を追加したことにも気付くでしょう。製品に対して行われた注文の更新された表現をPUTしていることを示すため。

于 2013-01-12T13:27:12.440 に答える