JAX-RSでの入力値の受取と返却 †以下、JAX-RS でサービスを作成する場合の、値の受け取り、および 返却方法について記載する。 URLとサービスの紐付け方法 †Class および メソッドに付与した @Path アノテーション、および @GET、@POST、@PUT、@DELETE アノテーションにより決定される。 // ↓ このアノテーションは /books へのリクエストをこのクラスが処理する事を示しています @Path("books") public class BooksResource { @GET public String test(){ // このメソッドは /books へのGETリクエスト時に実行される return "test!"; } @POST public String post(){ // このメソッドは /books へのPOSTリクエスト時に実行される return "test!"; } @PUT public String put(){ // このメソッドは /books へのPUTリクエスト時に実行される return "test!"; } @DELETE public String delete(){ // このメソッドは /books へのDELETEリクエスト時に実行される return "test!"; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 以下のように メソッドに @Path アノテーションを付与する事により、さらに 細かく制御する事が可能です。 //////////////////////////////////////////////////////////////////////////////////////////////////////////////// @GET @Path("{id}") public String test(){ // このメソッドは /books/1 等へのGETリクエスト時に実行される return "test!"; } @POST @Path("test") public String test(){ // このメソッドは /books/test へのPOSTリクエスト時に実行される return "test!"; } } 値の受取方法 †受信するデータ形式の指定方法 †メソッドに @Consumes アノテーションを付与する事により受信データの形式を指定します。 // この例では JSONデータを受け取ります @GET @Consumes(MediaType.APPLICATION_JSON) public Map<String,Object> test1() { ・ ・ } // 以下のように複数のデータ形式を受け付ける事も可能です @GET @Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML }) public Map<String,Object> test1() { ・ ・ } URLの一部を値として受け取る †メソッド引数に @PathParam を付与する事により、URLの一部からリクエストデータを取得する事ができます。 @Path("books") public class BooksResource { // 以下の例では books/123 へのリクエスト時に、id=123 を受け取る事ができます。 @GET @Path("{id}") @Produces(MediaType.APPLICATION_XML) public BookDto show1(@PathParam("id") Integer id) { ・ ・ } // 以下の例では books/test/123/abc へのリクエスト時に、id=123、no="abc" を受け取る事ができます。 @GET @Path("test/{id}/{no}") @Produces(MediaType.APPLICATION_XML) public BookDto show2(@PathParam("id") Integer id, @PathParam("no") String no) { ・ ・ } } FORMへの入力値を個別に受け取る †メソッド引数に @FormParam を付与する事により、POSTされたFORMデータを取得する事ができます。 @POST @Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML }) @Produces(MediaType.APPLICATION_JSON) public String create(@FormParam("isbn") String isbn, @FormParam("title") String title, @FormParam("price") String price) { ・ ・ } FORMへの入力値をBeanで受け取る †メソッド引数に @BeanParam を付与する事により、POST、PUTされたデータをBean、Dto で一括で受け取る事ができます。 @Path("books") public class BooksResource { @POST @Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML }) @Produces(MediaType.APPLICATION_JSON) public String create(@BeanParam BookDto book) { ・ ・ } } Dto の項目には @FormParam が必要です。 public class BookDto { ・ ・ @FormParam("isbn") private String isbn; @FormParam("title") private String title; @FormParam("price") private int price; ・ ・ } FORMへの入力値をMapで受け取る †引数の型を MultivaluedMap にすると入力データをMapで受け取る事ができる @PUT @Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML }) @Produces(MediaType.APPLICATION_JSON) public Map<String,Object> update(MultivaluedMap<String, String> params) { Iterator<Map.Entry<String,List<String>>> it = params.entrySet().iterator(); while (it.hasNext()) { Entry<String,List<String>> entry = it.next(); String key = entry.getKey(); List<String> vals = entry.getValue(); System.out.println(key + "=" + vals.get(0)); // ここでは値リストの1件目だけを表示(MultivaluedMap はキーに対して複数の値を持つ為) } ・ ・ } 値の返却方法 †返却するデータ形式の指定方法 †メソッドに @Produces アノテーションを付与する事により返却値の形式を指定します。 @GET @Produces(MediaType.APPLICATION_JSON) public Map<String,Object> test1() { ・ ・ } 値の返却例 †実際にメソッドから返却するデータ型は自由に選ぶ事ができます。 // この例では Map が JSON に変換されて返却されます。 @GET @Path("test1") @Produces(MediaType.APPLICATION_JSON) public Map<String,Object> test1() { Map<String,Object> book = new HashMap<String,Object>(); book.put("id", 1); book.put("isbn", "ISBN1"); book.put("title", "タイトル1"); book.put("price", 1001); return book; } // この例では BookDto が XML に変換されて返却されます。 // ただし、Dtoクラスに @XmlRootElement アノテーションが必要です。(後述を参照) @GET @Path("test2") @Produces(MediaType.APPLICATION_XML) public BookDto test2() { BookDto book = new BookDto(); book.setId(1); book.setIsbn("ISBN1"); book.setTitle("タイトル1"); book.setPrice(1001); return book; } // 自分で JSONやXML文字列を組み立てて返却する事も可能です @GET @Path("test3") @Produces(MediaType.APPLICATION_JSON) public String test3() { return "{ \"method\" : \"test3\" }"; } XMLを返却する場合に、DTO に付与するアノテーション †XMLを返却する場合は、Dtoクラスに @XmlRootElement アノテーションを付与する必要があります // この場合、XMLルート要素は <book> となります。 @XmlRootElement(name="book") public class BookDto { ・ ・ } // name を省略した場合は DTOクラス名(<BookDto>)がルート要素名となります。 @XmlRootElement public class BookDto { ・ ・ } |