2010-06-24 11 views
5

Chcę utworzyć usługę REST, która może zwrócić JSON lub XML. Jaki parametr żądania ustawiam w żądaniu, aby zażądać określonego typu MIME? Wiem, jak ustawić to w odpowiedzi, ale musi istnieć sposób, aby poprosić o jeden. Obecnie robię to w adresie URLWiele typów reakcji z tym samym REST GET?

restServlet/silnik/2WS2345

jsonServlet/silnik/2WS2345

to dostaje mnie JSON lub XML. Ale myślałem, że przeczytałem, że istnieje parametr do ustawienia w żądaniu. Używam Java ...

+0

Tag java powinien zostać dodany. – h3xStream

Odpowiedz

4

Jeśli używasz koszulki, możesz łatwo skonfigurować metodę za pomocą adnotacji @Produces. @Produkcje ({"application/xml", "application/json"})

Dobrze, że nadal możesz mieć obiekt JAXB jako typ zwrotu. Zostanie automatycznie zmieniony na wymagany format. O ile w nagłówku Accept nie określono typu MIME, zawsze będzie wysyłał xml w powyższym przypadku.

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

5

Można to zrobić z Restlet wykorzystaniem adnotacji w kodzie i albo niech Content-negocjację działać w zależności od Accept nagłówka User-agent lub określić rozszerzenie w URI (używając TunnelService Restlet i MetadataService). Oto przykład (na podstawie 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(); 
    } 
} 

Content-negocjacja działa poprzez nagłówku Accept:

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

także działa poprzez rozszerzenie (dzięki getTunnelService().setExtensionsTunnel(true)):

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

Jest default list of extension to media-type mapping, ale to może być skonfigurowane poprzez MetadataService.

+0

Tak, i dzięki. Tajny sos to: req.getHeader ("Accept"). Zwraca ciąg, który można parsować. Oto, co otrzymam, gdy NIE ustawiam go i używam przeglądarki: 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, */* Dzięki! – markthegrea

Powiązane problemy