Desculpe, essa pergunta parece boba, mas depois de desenvolver alguns dos meus serviços RESTful usando Jersey, me perguntei - Se REST é apenas uma arquitetura, e não um protocolo como SOAP, por que precisamos de uma especificação como JAX-RS?
Na verdade, pesquisei no Google por questões como "Qual é a diferença entre servlets e serviços RESTful sobre HTTP" e, para resumir as respostas da comunidade, obtive:
- O desenvolvimento de serviço RESTful (em Jersey) é uma arquitetura que usa servlets inerentemente.
- Ferramentas compatíveis com JAX-RS, como Jersey, fornecem fácil empacotamento e descompressão de dados XML / JSON, ajudando os desenvolvedores.
- REST nos ajuda a usar GET / POST / PUT / DELETE de uma maneira muito eficiente do que servlets normais.
De acordo com essas respostas, acho que se eu escrever um servlet que usa JAXB (para lidar com a serialização automática) e usar GET / POST / PUT / DELETE em meu código de servlet, não uso uma ferramenta como Jersey e daí JAX-RS.
Sei que estou terrivelmente errado ao passar esta afirmação, corrija-me.
PS: Essa dúvida realmente surgiu quando tive que desenvolver alguns serviços RESTful em PHP. Depois de passar por alguns dos códigos PHP RESTful, percebi que são apenas os mesmos scripts PHP antigos, com alguns métodos auxiliares para lidar com XML / JSON.
Respostas:
Resposta curta
Porque facilita o desenvolvimento de serviços RESTful.
Resposta longa
JAX-RS é um padrão que facilita a criação de um serviço RESTful que pode ser implantado em qualquer servidor de aplicativos Java: GlassFish, WebLogic, WebSphere, JBoss, etc.
JAX-RS faz parte do Java EE, e quando JAX-RS é usado com outras tecnologias Java EE, torna-se ainda mais fácil criar seu serviço RESTful:
Serviço JAX-RS de amostra
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); } } @GET @Produces(MediaType.APPLICATION_XML) @Path("findCustomersByCity/{city}") public List<Customer> findCustomersByCity(@PathParam("city") String city) { Query query = entityManager.createNamedQuery("findCustomersByCity"); query.setParameter("city", city); return query.getResultList(); } }
Para maiores informações:
fonte
Não não é. REST é um estilo de arquitetura que pode ser implementado usando servlets, mas não os usa inerentemente, nem tem nada a ver com Java.
JAX-RS é uma especificação JSR que define uma API Java para serviços da web RESTful.
Jersey é uma implementação específica de JAX-RS.
Quanto a usar Jersey ou tentar ser compatível com a especificação JAX-RS, isso depende de você. Se isso facilita o seu trabalho, ótimo! Se não, ninguém está te forçando.
fonte