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 {
・
・
}
|