Java 具有相同REST的多个响应类型得到了什么?

Java 具有相同REST的多个响应类型得到了什么?,java,rest,Java,Rest,我想创建一个可以返回JSON或XML的REST服务。我在请求中设置了什么请求参数来请求某个mime类型?我知道如何在响应中设置它,但必须有一种方法来请求某个响应。目前我是在URL中做的 restServlet/engine/2WS2345 jsonServlet/engine/2WS2345 这就得到了json或xml。但是我想我读到请求中有一个参数要设置。我正在使用JAVA…您可以通过在代码中使用注释来实现这一点,或者让内容协商根据用户代理的Accept头运行,或者在URI中指定扩展名(使用R

我想创建一个可以返回JSON或XML的REST服务。我在请求中设置了什么请求参数来请求某个mime类型?我知道如何在响应中设置它,但必须有一种方法来请求某个响应。目前我是在URL中做的

restServlet/engine/2WS2345

jsonServlet/engine/2WS2345

这就得到了json或xml。但是我想我读到请求中有一个参数要设置。我正在使用JAVA…

您可以通过在代码中使用注释来实现这一点,或者让内容协商根据用户代理的
Accept
头运行,或者在URI中指定扩展名(使用Restlet的TunnelService和MetadataService)。下面是一个示例(基于Restlet 2):

公共类测试应用程序扩展了应用程序{
公共静态类TestResource扩展了ServerResource{
@获取(“txt”)
公共代表toText(){
返回新的StringRepresentation(“Hello!”,
MediaType.TEXT(纯文本);
}
@获取(“xml”)
公共代表{
返回新的StringRepresentation(“Hello”,
MediaType.APPLICATION(XML);
}
}
@凌驾
公共同步Restlet createInboundRoot(){
getTunnelService().setEnabled(true);
getTunnelService().setExtensionsTunnel(true);
路由器=新路由器();
attachDefault(TestResource.class);
返回路由器;
}
公共静态void main(字符串[]args)引发异常{
组件=新组件();
component.getServers().add(Protocol.HTTP,8182);
component.getDefaultHost().attachDefault(NewTestApplication());
component.start();
}
}
内容协商通过Accept标头进行:

  • curl-H“接受:文本/普通”http://localhost:8182/test
    返回
    你好
  • curl-H“接受:应用程序/xml”http://localhost:8182/test
    返回
    Hello
它还可以通过扩展工作(感谢
getTunnelsService().setExtensionsTunnel(true)
):

  • curlhttp://localhost:8182/test.txt
    返回
    你好
  • curlhttp://localhost:8182/test.xml
    返回
    Hello

有一个,但可以通过MetadataService进行配置。

如果您使用jersey,则可以使用@products注释轻松配置该方法。 @产生({“application/xml”、“application/json”})

好的是,您仍然可以使用JAXB对象作为返回类型。它将自动更改为所需的格式。除非在接受头中指定MIME类型,否则在上述情况下,它将始终发送xml


是的,谢谢。秘密是: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,/谢谢!
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();
    }
}