以前、Jaxb を使用して Web サービスに取り組んだことがあります。xsd から Java を生成し、HTTP ポストを使用して指定した URL に xml リクエストをポストしていました。最近、この Restful Web サービスについて耳にしましたが、それを読んで、私が以前に行っていたのは Restful Web サービスだけであると感じました。しかし、それが同じものかどうかはわかりません。誰か説明してください。
2 に答える
同じタイプのRESTfulサービスを作成しているようです。JAX-RSは、RESTfulサービスを作成するためのより簡単な方法を定義する標準であり、JAXBはapplication/xml
メディアタイプの標準バインディングレイヤーです。以下はサービスの例です。
package org.example;
import java.util.List;
import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {
@PersistenceContext(unitName="CustomerService",
type=PersistenceContextType.TRANSACTION)
EntityManager entityManager;
@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(Customer customer) {
entityManager.persist(customer);
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("{id}")
public Customer read(@PathParam("id") long id) {
return entityManager.find(Customer.class, id);
}
@PUT
@Consumes(MediaType.APPLICATION_XML)
public void update(Customer customer) {
entityManager.merge(customer);
}
@DELETE
@Path("{id}")
public void delete(@PathParam("id") long id) {
Customer customer = read(id);
if(null != customer) {
entityManager.remove(customer);
}
}
}
詳細については
「RESTful」と言えば、HTTP メソッドと URL パターンの規則にすぎません。
CRUD METHOD URL RESPONSE DESCRIPTION
----------------------------------------------------------------
CREATE POST http://www.doma.in/people 202 Creates a new person with given entity body
READ GET http://www.doma.in/people 200
READ GET http://www.doma.in/people/1 200 404 Reads a single person
UPDATE PUT http://www.doma.in/people/2 204 Updates a single person with given entity body
DELETE DELETE http://www.doma.in/people/1 204 Deletes a person mapped to given id(1)
この種のコントラクトを Sevlets で実装することもできます。実は私は の時代よりも前に Sevlets を使っていました JAX-RS
。
を使用すると、生活がはるかに楽になりますJAX-RS
。
これは、Mr. Blaise Doughan のバージョンを少し変更したものです。Blaise Doughan 氏のコードには何も問題はありません。
上記の URL パターンをさらに追加したいだけです。
優れた機能の 1 つは、優れたJAX-RS
JAXB クラスがあれば、クライアントが望むように XML と JSON を提供できることです。同じ方法でこれら 2 つの形式については@Produces
、 およびを参照してください。@Consumes
クライアントが で XML として受信したい場合は、XML をAccept: application/xml
取得するだけです。
クライアントが で JSON として受信したい場合は、JSON をAccept: application/json
取得するだけです。
@Path("/customers");
public class CustomersResource {
/**
* Reads all person units.
*/
@POST
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response read() {
final List<Customer> listed = customerBean.list();
final Customers wrapped = Customers.newInstance(listed);
return Response.ok(wrapped).build();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response createCustomer(final Customer customer) {
entityManager.persist(customer);
return Response.created("/" + customer.getId()).build();
}
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/{id: \\d+}")
public Response read(@PathParam("id") final long id) {
final Customer customer = entityManager.find(Customer.class, id);
if (customer == null) {
return Response.status(Status.NOT_FOUND).build();
}
return Response.ok(customer).build();
}
@PUT
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void updateCustomer(final Customer customer) {
entityManager.merge(customer);
}
@DELETE
@Path("/{id: \\d+}")
public void deleteCustomer(@PathParam("id") final long id) {
final Customer customer = entityManager.find(Customer.class, id);
if (customer != null) {
entityManager.remove(customer);
}
return Response.status(Status.NO_CONTENT).build();
}
}
いくつかの画像を提供したいとしますか?
@GET
@Path("/{id: \\d+}")
@Produces({"image/png", "image/jpeg"})
public Response readImage(
@HeaderParam("Accept") String accept,
@PathParam("id") final long id,
@QueryParam("width") @DefaultValue("160") final int width,
@QueryParam("height") @DefaultValue("160") final int height) {
// get the image
// resize the image
// make a BufferedImage for accept(MIME type)
// rewrite it to an byte[]
return Response.ok(bytes).build();
// you can event send as a streaming outout
return Response.ok(new StreamingOutput(){...}).build();
}