2010-06-24 13 views
5

Quiero crear un servicio REST que pueda devolver JSON o XML. ¿Qué parámetro de solicitud configuro en la solicitud para solicitar un determinado tipo de mimo? Sé cómo configurarlo en la respuesta, pero debe haber una forma de solicitar una determinada. Actualmente lo hago en la URL¿Tipos de respuesta múltiple con el mismo REST GET?

restServlet/motor/2WS2345

jsonServlet/motor/2WS2345

Esto me pone JSON o XML. Pero pensé que había leído que hay un parámetro para establecer en la solicitud. Estoy utilizando JAVA ...

+0

etiqueta de java debe ser agregada. – h3xStream

Respuesta

4

Si está usando jersey, puede configurar fácilmente el método con la anotación @Produces. @Produces ({"application/xml", "application/json"})

Lo bueno es que todavía puede tener un objeto JAXB como tipo de devolución. Se cambiará automáticamente al formato requerido. A menos que se especifique el tipo MIME en el encabezado Aceptar, siempre enviará xml en el caso anterior.

Ref http://jersey.java.net/nonav/documentation/1.6/user-guide.html

5

Usted puede hacer esto con Restlet utilizando anotaciones en su código y, o bien dejar que el contenido de la negociación operan en función de la cabecera del agente de usuario Accept o especificar la extensión en el URI (usando TunnelService de Restlet y MetadataService). Aquí hay un ejemplo (basado en Restlet 2):

public class TestApplication extends Application { 
    public static class TestResource extends ServerResource { 
     @Get("txt") 
     public Representation toText() { 
      return new StringRepresentation("Hello!", 
       MediaType.TEXT_PLAIN); 
     } 

     @Get("xml") 
     public Representation toXml() { 
      return new StringRepresentation("<test>Hello</test>", 
       MediaType.APPLICATION_XML); 
     } 
    } 

    @Override 
    public synchronized Restlet createInboundRoot() { 
     getTunnelService().setEnabled(true); 
     getTunnelService().setExtensionsTunnel(true); 
     Router router = new Router(); 
     router.attachDefault(TestResource.class); 
     return router; 
    } 

    public static void main(String[] args) throws Exception { 
     Component component = new Component(); 
     component.getServers().add(Protocol.HTTP, 8182); 
     component.getDefaultHost().attachDefault(new TestApplication()); 
     component.start(); 
    } 
} 

de negociación de contenido funciona a través de la cabecera Accept:

  • curl -H "Accept: text/plain" http://localhost:8182/test vuelve Hello!
  • curl -H "Accept: application/xml" http://localhost:8182/test vuelve <test>Hello</test>

También funciona a través de la extensión (gracias a getTunnelService().setExtensionsTunnel(true)):

  • curl http://localhost:8182/test.txt vuelve Hello!
  • curl http://localhost:8182/test.xml devuelve <test>Hello</test>

hay un default list of extension to media-type mapping, pero esto se puede configurar a través de la MetadataService.

+0

Sí, y gracias. La salsa secreta es: req.getHeader ("Aceptar"). Esto devuelve una cadena que uno podría analizar. Esto es lo que obtengo cuando NO lo configuro y uso un navegador: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application /vnd.ms-xpsdocument, application/xaml + xml, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */* ¡Gracias! – markthegrea

Cuestiones relacionadas