パス パラメータは、特定のパターンに一致するリクエスト URL の一部です。そのため、パス パラメータとして指定できる文字数には制限があります。特に、特殊文字はすべて URL エンコードする必要があります。これは、どの種類のリクエスト ( GET、POST、PUT、DELETE ) でも同じように適用されます。
原則として、パス パラメーターを識別子やリソース エンドポイントなどの単純な値に制限する必要があります。より複雑なデータは、要求パラメーターまたは要求本文自体を介して REST サービスに渡す必要があります。エンティティ識別子をパス パラメーターとして渡し、エンティティ データを要求本文に渡す混合アプローチを次に示します。
@Path("/contacts/{id}")
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response updateContact(@PathParam final String contactId, Contact contact) {
}
上記の例では、contactIdはパス パラメーターとして取得され、連絡先は要求本文から自動的にシリアル化されます。
上で説明したのは一般的なルールです。あなたのケースの詳細については、あなたのコードで気づいたことの 1 つは、実際にはパス パラメーターを定義していないことです。@Path
REST メソッドで使用する前に、アノテーションの一部として定義する必要があることに注意してください。
@Path("/method/{obj1}/{obj2}")
public ResponseObject method(@Context Request request, @PathParam("obj1") Object obj1, @PathParam("obj2") String obj2) {
}
上記の変更により、クライアント側で URL が適切にエンコードされていれば、パラメーターが null として表示されることはなくなります。
* 編集 *
あなたのコメントに基づいて、JAX-RS 仕様とさまざまなパラメーターの型にもっと慣れる必要があると思います。RESTEasy JAX-RS ドキュメントを読むことをお勧めします。ベンダー固有の実装の詳細が含まれていますが、全体として JAX-RS の優れたガイドです。
@PathParam
目的: リクエスト URL の一部を変数に挿入するために使用されます。URL パラメータはURL の一部とは見なされないことに注意してください。
例: URL http://services.example.com/contacts/20578を指定すると、次のように定義できます。
@Path("/contacts/{id}")
そこから@PathParam("id")
.
public Response getContact(@PathParam("id") final String identifier);
これは、あらゆる種類の HTTP リクエスト ( GET、POST、PUT、DELETE ) で機能します。
@QueryParam
目的: クエリ文字列の一部またはフォーム エンコードされたデータを変数に挿入するために使用されます。クエリ文字列は、URL の?
. フォーム エンコード データは、リクエスト タイプがapplication/x-www-form-urlencoded の場合に、HTTP リクエストの本文で渡される URL エンコードされた名前と値のペア データです。通常、クエリ パラメータは、GET リクエストの場合は URL 文字列の一部として渡され、POST リクエストの場合はリクエスト ボディで渡されます。
例: URL http://services.example.com/contacts?group=Businessを指定すると、@QueryParam("group")
public Response getContactsInGroup(@QueryParam("group") final String groupName);
POST リクエストでクエリ パラメータを使用するのは一般的ではありませんが、リクエスト タイプがapplication/x-www-form-urlencoded の場合は可能です。
@POST
@Path("/contacts")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createContact(@QueryParam("contact") final Contact contactData, @QueryParam("metadata") final String metaData);
これらは高レベルの例にすぎません。リンクしたドキュメントを読んで、各パラメーター タイプがどのように機能するか、およびどのパラメーターをいつ使用するかのより良い例を取得してください。