13

私は Jersey を使用して RESTful サービスを開発していますが、GET メソッドでうまく機能します。ただし、POST メソッドと JSON またはテキスト パラメーターで動作させることはできません。これらは私がしたことです:

@Path("/method/")
@POST
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
@Produces({MediaType.APPLICATION_JSON})
public ResponseObject method(@Context Request request, @PathParam("ob1") Object obj1, @PathParam("obj2") String obj2) {
...
}

すべてのパラメーターに対して null 値しか取得していません。文字列だけをパラメーターとして使用しようとしましたが、どちらも機能しません... IOS からこれらのメソッドにアクセスしようとしていますが、それが問題の 1 つかもしれません。しかし、私は自分の LAN をスニッフィングしており、パケット本体の正しいパラメーターを確認できます...これは正しいですか??

XCode からさまざまな本文コンテンツを次のように送信しました。

obj1={"id1": "value1", "id2" : "value2"}&obj2=xxxx

と:

{"id1": "value1", "id2" : "value2"},xxxx

結果なしで @QueryParam と @PathParam で遊んでいる間...常にnull...

ご協力いただきありがとうございます!

4

4 に答える 4

25

パス パラメータは、特定のパターンに一致するリクエスト URL の一部です。そのため、パス パラメータとして指定できる文字数には制限があります。特に、特殊文字はすべて URL エンコードする必要があります。これは、どの種類のリクエスト ( GETPOSTPUTDELETE ) でも同じように適用されます。

原則として、パス パラメーターを識別子やリソース エンドポイントなどの単純な値に制限する必要があります。より複雑なデータは、要求パラメーターまたは要求本文自体を介して REST サービスに渡す必要があります。エンティティ識別子をパス パラメーターとして渡し、エンティティ データを要求本文に渡す混合アプローチを次に示します。

@Path("/contacts/{id}")
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response updateContact(@PathParam final String contactId, Contact contact) {
}

上記の例では、contactIdはパス パラメーターとして取得され、連絡先は要求本文から自動的にシリアル化されます。

上で説明したのは一般的なルールです。あなたのケースの詳細については、あなたのコードで気づいたことの 1 つは、実際にはパス パラメーターを定義していないことです。@PathREST メソッドで使用する前に、アノテーションの一部として定義する必要があることに注意してください。

@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 リクエスト ( GETPOSTPUTDELETE ) で機能します。


@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);

これらは高レベルの例にすぎません。リンクしたドキュメントを読んで、各パラメーター タイプがどのように機能するか、およびどのパラメーターをいつ使用するかのより良い例を取得してください。

于 2012-04-28T05:58:43.120 に答える
6

私はJavaでWebサービスの開発を始めたばかりで、POSTデータにも同じ問題がありました。@FormParamを使用して POST データを読み取るための非常に簡単なソリューションを得ました。実際には@QueryParam を使用して POST データを読み取っていました。GETメソッドを使用して QueryString データを読み取るためだけだと思います

ここで提供される非常に優れたドキュメント。この記事を読んで、私の混乱のほとんどが解消されました。 http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html_single/index.html

ヒント: @FormParam を使用しているときに、"application/x-www-form-urlencoded" MIME タイプを使用していることを確認してください。

于 2013-03-08T09:57:31.110 に答える
1

これを受け入れられた回答へのコメントとして投稿しますが、それができるのは恥ずかしがり屋です。

上記の優れたアドバイスに加えて、少なくともバージョン 2.0.x では、Jersey は@FormParam クエリ文字列からプルしないことを付け加えておきます。代わりに、リクエスト本文に名前と値のペアとして含まれていることを期待しています。

たとえば、 の代わりに、次 の本文POST http://localhost/app?name=Joeを送信します 。POST http://localhost/app

name=Joe
于 2016-09-09T21:46:11.613 に答える
-3

と属性を持つtenantオブジェクトがあり、REST リソースが と を介して公開されて いるとします。idname@POST@PATH("/xyz/tenants")

JSON での本文の例:

{"id":"001","name":"myname"}

XML での本文の例:

<tenant><id>001</id><name>myname</name></tenant>
于 2012-05-09T22:30:31.137 に答える