2010-06-24 12 views
5

Ich möchte einen REST-Service erstellen, der entweder JSON oder XML zurückgeben kann. Welchen Anfrageparameter setze ich in der Anfrage, um einen bestimmten Mime-Typ anzufordern? Ich weiß, wie man es in der Antwort einstellt, aber es muss einen Weg geben, einen bestimmten anzufordern. Zur Zeit mache ich es in der URLMehrere Antworttypen mit demselben REST GET?

restServlet/Motor/2WS2345

jsonServlet/Motor/2WS2345

Das bin ich json oder xml bekommt. Aber ich dachte, ich lese, dass ein Parameter in der Anfrage gesetzt werden muss. Ich JAVA bin mit ...

+0

Java-Tag sollte hinzugefügt werden. – h3xStream

Antwort

4

Wenn Sie Trikot verwenden, können Sie die Methode einfach mit @Produces Annotation konfigurieren. @Produces ({"application/xml", "application/json"})

Gut, dass Sie immer noch ein JAXB-Objekt als Rückgabetyp haben können. Es wird automatisch in das erforderliche Format geändert. Wenn der MIME-Typ nicht im Accept-Header angegeben ist, wird im obigen Fall immer xml gesendet.

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

5

Sie können dies tun, mit Restlet mit Anmerkungen in Ihrem Code und entweder lassen Sie die Inhalte-Negotiation arbeitet je nach Accept Header User-Agenten oder die Erweiterung in der URI (mit Restlet des TunnelService und Metadaten-Service). Hier ist ein Beispiel (basierend auf 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(); 
    } 
} 

Inhalt-Negotiation funktioniert über den Accept-Header:

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

Es ist auch funktioniert über die Erweiterung (dank getTunnelService().setExtensionsTunnel(true)):

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

Es gibt eine default list of extension to media-type mapping, aber dies kann über die MetadataService konfiguriert werden.

+0

Ja, und danke. Die geheime Soße ist: req.getHeader ("Accept"). Dies gibt einen String zurück, den man analysieren könnte. Hier ist, was ich bekomme, wenn ich es nicht setze und einen Browser verwende: image/gif, image/jpeg, image/pjpeg, image/pjpeg, applikation/x-ms-applikation, application/x-ms-xbap, applikation /vnd.ms-xpsdocument, application/xaml + xml, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */* Vielen Dank! – markthegrea

Verwandte Themen