私の POST メソッドは次のようになります:
@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
System.out.println("param1 = " + param1);
System.out.println("param2 = " + param2);
}
Netbeans で Jersey クライアントを作成すると、 post メソッドを呼び出すメソッドは次のようになります。
public void create(Object requestEntity){
webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}
このテストを実行する場合:
@Test
public void hello(){
String json = "{param1=\"hello\",param2=\"hello2\"}";
this.client.create(json);
}
サーバーでは次の出力が生成されます。
INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 =
パラメータが正しい値を与えるようにするには何を変更する必要がありますか?
ベストアンサー1
メソッド@POST
は文字列ではなくJSONオブジェクトを受け入れる必要があります。JerseyはJAXBを使用してJSONオブジェクトのマーシャリングとアンマーシャリングをサポートしています(詳細についてはジャージードキュメントをご覧ください次のようなクラスを作成します。
@XmlRootElement
public class MyJaxBean {
@XmlElement public String param1;
@XmlElement public String param2;
}
メソッド@POST
は次のようになります。
@POST @Consumes("application/json")
@Path("/create")
public void create(final MyJaxBean input) {
System.out.println("param1 = " + input.param1);
System.out.println("param2 = " + input.param2);
}
このメソッドは、HTTP POST の本文として JSON オブジェクトを受け取ることを想定しています。input
この場合、JAX-RS は HTTP メッセージのコンテンツ本文を注釈なしのパラメータとして渡します。実際のメッセージは次のようになります。
POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com
{"param1":"hello","param2":"world"}
このようにJSONを使用することは、明らかな理由から非常に一般的です。ただし、JavaScript以外のものでJSONを生成または使用する場合は、データを適切にエスケープするように注意する必要があります。JAX-RSでは、メッセージボディリーダーそしてメッセージボディライターこれを実装します。Jersey には、必要な型 (Java プリミティブや JAXB ラップ クラスなど) と JSON の実装がすでにあると思います。JAX-RS は、データを渡すための他の多くの方法をサポートしています。データは単純な引数渡しを使用して渡されるため、新しいクラスを作成する必要はありません。
html<FORM>
パラメータは次のように注釈される。@フォームパラメータ:
@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
@FormParam("param2") String param2) {
...
}
ブラウザはフォームを次のようにエンコードします。「アプリケーション/x-www-form-urlencoded」JAX-RS ランタイムは、本体をデコードしてメソッドに渡します。ワイヤ上に表示される内容は次のとおりです。
POST /create HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 25
param1=hello¶m2=world
内容はURLエンコードこの場合。
FormParam の名前がわからない場合は、次の操作を実行できます。
@POST @Consumes("application/x-www-form-urlencoded")
@Path("/create")
public void create(final MultivaluedMap<String, String> formParams) {
...
}
HTTP ヘッダー
あなたは@ヘッダーパラメータHTTP ヘッダー経由でパラメータを渡す場合は、次のアノテーションを使用します。
@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
@HeaderParam("param2") String param2) {
...
}
HTTP メッセージは次のようになります。この POST には本文がないことに注意してください。
POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world
このメソッドは、一般的なパラメータの受け渡しには使用しません。ただし、特定の HTTP ヘッダーの値にアクセスする必要がある場合には非常に便利です。
HTTP クエリパラメータ
このメソッドは主にHTTP GETで使用されますが、POSTにも同様に適用できます。@クエリパラメータ注釈。
@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
@QueryParam("param2") String param2) {
...
}
前の手法と同様に、クエリ文字列を介してパラメータを渡す場合、メッセージ本文は必要ありません。HTTP メッセージは次のとおりです。
POST /create?param1=hello¶m2=world HTTP/1.1
Content-Length: 0
Host: www.example.com
特に注意して適切にクエリパラメータをエンコードするクライアント側では、クエリ パラメータを使用すると、一部のプロキシによって適用される URL の長さ制限や、エンコードに関連する問題により問題が発生する可能性があります。
HTTP パスパラメータ
パスパラメータはクエリパラメータに似ていますが、HTTPリソースパスに埋め込まれている点が異なります。この方法は今日では好まれているようです。パスはHTTPリソースを実際に定義するものであるため、HTTPキャッシュに影響があります。コードは他のものと少し異なります。@パス注釈が変更され、@パスパラメータ:
@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
@PathParam("param2") String param2) {
...
}
メッセージはクエリ パラメータ バージョンと似ていますが、パラメータの名前がメッセージのどこにも含まれていない点が異なります。
POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com
このメソッドは、クエリ パラメータ バージョンと同じエンコードの問題を共有します。パスセグメントは異なる方法でエンコードされますですので、そこにも注意する必要があります。
ご覧のとおり、それぞれの方法には長所と短所があります。選択は通常、クライアントによって決定されます。FORM
ベースの HTML ページを提供している場合は、 を使用します@FormParam
。クライアントが JavaScript+HTML5 ベースである場合は、おそらく JAXB ベースのシリアル化と JSON オブジェクトを使用することをお勧めします。MessageBodyReader/Writer
実装によって必要なエスケープが処理されるため、問題が発生する可能性が 1 つ減ります。クライアントが Java ベースであるが、優れた XML プロセッサを備えていない場合 (Android など)、FORM
コンテンツ本体は URL よりも簡単に生成して適切にエンコードできるため、エンコードを使用することをお勧めします。このミニ ウィキ エントリが、JAX-RS がサポートするさまざまな方法についての参考になれば幸いです。
注記:完全な開示のために言っておきますが、私はまだ Jersey のこの機能を実際に使用していません。私たちは、JAXB+JAX-RS アプリケーションを多数導入しており、モバイル クライアント領域に移行しているため、この機能をいじっていました。JSON は、HTML5 上の XML や jQuery ベースのソリューションにはるかに適しています。