2010-06-24 4 views
5

Je souhaite créer un service REST pouvant renvoyer JSON ou XML. Quel paramètre de requête dois-je définir dans la requête pour demander un certain type mime? Je sais comment le mettre dans la réponse, mais il doit y avoir un moyen d'en demander un certain. À l'heure actuelle, je le fais dans l'URLTypes de réponses multiples avec le même REST GET?

restServlet/moteur/2WS2345

jsonServlet/moteur/2WS2345

Cela me reçoit JSON ou XML. Mais je pensais avoir lu qu'il y avait un paramètre à définir dans la requête. J'utilise JAVA ...

+0

java tag doit être ajouté. – h3xStream

Répondre

4

Si vous utilisez jersey, vous pouvez facilement configurer la méthode avec l'annotation @Produces. @Produces ({"application/xml", "application/json"})

Bonne chose est que vous pouvez toujours avoir un objet JAXB comme type de retour. Il sera automatiquement changé au format requis. Sauf si le type MIME est spécifié dans l'en-tête Accept, il enverra toujours xml dans le cas ci-dessus.

Réf http://jersey.java.net/nonav/documentation/1.6/user-guide.html

5

Vous pouvez le faire avec Restlet en utilisant des annotations dans votre code et soit laisser la négociation de contenu exploitons en fonction de la tête Accept de l'agent utilisateur ou spécifier l'extension dans l'URI (à l'aide de TunnelService de Restlet et MetadataService). Voici un exemple (basé sur 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(); 
    } 
} 

travaille négociation de contenu via l'en-tête Accept:

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

Il a également fonctionne via l'extension (merci à getTunnelService().setExtensionsTunnel(true)):

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

Il y a un default list of extension to media-type mapping, mais cela peut être configuré via le MetadataService.

+0

Oui, et merci. La sauce secrète est: req.getHeader ("Accepter"). Cela renvoie une chaîne que l'on pourrait analyser. Voici ce que je reçois quand je ne le configure pas et utilise un navigateur: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/application x-ms, 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, */* Merci! – markthegrea

Questions connexes