1

以前、Jaxb を使用して Web サービスに取り組んだことがあります。xsd から Java を生成し、HTTP ポストを使用して指定した URL に xml リクエストをポストしていました。最近、この Restful Web サービスについて耳にしましたが、それを読んで、私が以前に行っていたのは Restful Web サービスだけであると感じました。しかし、それが同じものかどうかはわかりません。誰か説明してください。

4

2 に答える 2

0

同じタイプの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);
        }
    }

}

詳細については

于 2012-08-13T01:31:40.583 に答える
0

「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-RSJAXB クラスがあれば、クライアントが望むように 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();
}
于 2012-08-16T14:37:08.273 に答える