2010-06-24 58 views
5

我想創建一個可以返回JSON或XML的REST服務。我在請求中設置了什麼請求參數來請求某種MIME類型?我知道如何在響應中設置它,但必須有辦法請求某個特定的響應。目前,我這樣做是在URL具有相同REST GET的多個響應類型?

restServlet /發動機/ 2WS2345

jsonServlet /發動機/ 2WS2345

這讓我JSON或XML。但我想我讀了有一個參數在請求中設置。我正在使用JAVA ...

+0

應該添加java標籤。 – h3xStream 2010-06-24 13:22:06

回答

4

如果您使用球衣,您可以使用@Produces註釋輕鬆配置方法。 @Produces({「application/xml」,「application/json」})

好東西是你仍然可以擁有一個JAXB對象作爲返回類型。它會自動更改爲所需的格式。除非在Accept Header中指定了MIME類型,否則它將始終在上述情況下發送xml。

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

5

您可以使用Restlet在代碼中使用註釋並根據用戶代理的Accept標頭運行內容協商或在URI中指定擴展(使用Restlet的TunnelService和MetadataService)。下面是一個例子(基於的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(); 
    } 
} 

內容協商經由Accept首部的工作原理:

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

它還通過分機工作(感謝getTunnelService().setExtensionsTunnel(true)):

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

有一個default list of extension to media-type mapping,但是這可以通過MetadataService進行配置。

+0

是的,謝謝。祕訣是:req.getHeader(「Accept」)。這會返回一個可以解析的字符串。下面是當我不設置它並使用瀏覽器時得到的內容: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,*/* Thanks! – markthegrea 2010-06-24 15:06:22

相關問題