java - library - JAX-RS con servidor incorporado
restful example java (3)
Aclaración: esta pregunta era sobre GZIPping un servicio REST basado en JAX-WS, pero he decidido cambiar el tema para que sea más fácil de encontrar
Estoy implementando un servicio REST a través del Provider <Source>
JAX-WS Provider <Source>
, y lo publico con un Endpoint
estándar (la razón es que quiero evitar el uso de un contenedor de servlets o un servidor de aplicaciones).
¿Hay una manera de hacer que el servidor responda al contenido de la respuesta gzip, si Accept-Encoding: gzip
está presente?
CÓMO
Las muestras proporcionadas por nicore
realmente funcionan y le permiten hacer un servidor de estilo JAX-RS sobre un servidor ligero incorporado sin contenedor de servlets, pero hay algunos momentos que deben considerarse.
Si prefiere administrar las clases por su cuenta (y ahorrar un tiempo durante el inicio), puede usar lo siguiente:
Ejemplo
JAX-RS hola clase mundial:
@Path("/helloworld")
public class RestServer {
@GET
@Produces("text/html")
public String getMessage(){
System.out.println("sayHello()");
return "Hello, world!";
}
}
Método principal:
Para servidor Simple :
public static void main(String[] args) throws Exception{
DefaultResourceConfig resourceConfig = new DefaultResourceConfig(RestServer.class);
// The following line is to enable GZIP when client accepts it
resourceConfig.getContainerResponseFilters().add(new GZIPContentEncodingFilter());
Closeable server = SimpleServerFactory.create("http://0.0.0.0:5555", resourceConfig);
try {
System.out.println("Press any key to stop the service...");
System.in.read();
} finally {
server.close();
}
}
Para Grizzly2 :
public static void main(String[] args) throws Exception{
DefaultResourceConfig resourceConfig = new DefaultResourceConfig(RestServer.class);
// The following line is to enable GZIP when client accepts it
resourceConfig.getContainerResponseFilters().add(new GZIPContentEncodingFilter());
HttpServer server = GrizzlyServerFactory.createHttpServer("http://0.0.0.0:5555" , resourceConfig);
try {
System.out.println("Press any key to stop the service...");
System.in.read();
} finally {
server.stop();
}
}
Dependencias resueltas:
Sencillo:
- Marco simple en sí mismo
- jersey-simple-server
Oso pardo:
- grizzly-framework
- grizzly-http
- grizzly-http-server (repositorio diferente!)
- jersey-grizzly2
Jersey:
darse cuenta
Asegúrese de que el archivo javax.ws.rs
entrado en su classpath, ya que entra en conflicto con la implementación de Jersey. Lo peor aquí es un error 404 silencioso sin registro, solo se registra una pequeña nota en el nivel FINER
.
Si realmente quiere hacer REST con Java, le sugiero que utilice una implementación JAX-RS (RESTeasy, Jersey ...).
Si su principal preocupación es la dependencia de un contenedor de servlets, puede usar JAX-RS RuntimeDelegate para registrar su aplicación como un punto final JAX-RS.
// Using grizzly as the underlaying server
SelectorThread st = RuntimeDelegate.createEndpoint(new MyApplication(), SelectorThread.class);
st.startEndpoint();
// Wait...
st.stopEndpoint();
Con respecto a la codificación GZIP
, cada proveedor de JAX-RS tiene diferentes enfoques. Jersey proporciona un filtro para realizar la codificación de forma transparente. RESTEasy proporciona una anotación para eso .
EDITAR
Hice algunas pequeñas pruebas. Las siguientes dos cosas definitivamente funcionarán para usted, asumiendo que está usando Maven .
Usando Jersey + SimpleServer :
public static void main( String[] args ) throws Exception {
java.io.Closeable server = null;
try {
// Creates a server and listens on the address below.
// Scans classpath for JAX-RS resources
server = SimpleServerFactory.create("http://localhost:5555");
System.out.println("Press any key to stop the service...");
System.in.read();
} finally {
try {
if (server != null) {
server.close();
}
} finally {
;
}
}
}
con dependencias maven
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-simple-server</artifactId>
<version>1.10</version>
</dependency>
O usando el Jersey + Grizzly2 :
public static void main(String[] args) throws Exception {
HttpServer server = null;
try {
server = GrizzlyServerFactory.createHttpServer("http://localhost:5555");
System.out.println("Press any key to stop the service...");
System.in.read();
} finally {
try {
if (server != null) {
server.stop();
}
} finally {
;
}
}
}
con dependencias maven
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-grizzly2</artifactId>
<version>1.10</version>
</dependency>
Hablando RuntimeDelegate
, tampoco pude hacer funcionar la muestra RuntimeDelegate
. Ciertamente, también hay una manera de iniciar RESTEasy fuera de la caja, pero no puedo recordarlo en este momento.
Si usa CXF para su implementación JAX-WS (o JAX-RS), simplemente podría agregar la anotación @GZIP en la clase de servicio.
gzipping la salida es la responsabilidad de la implementación de JAX WS. Debe consultar la documentación del servidor (Tomcat, Glassfish, JBoss, etc.) para configurar sus escuchas de la red http.