使用自定义媒体类型的Restlet

时间:2015-06-08 09:01:36

标签: java json restlet restlet-2.0 media-type

在Restlet 2.3(SE)中我试图使用媒体类型来控制版本。我目前的尝试涉及在我的入境路线中注册新的扩展程序:

@Override
public Restlet createInboundRoot() {

        ...
        getTunnelService().setExtensionsTunnel(true);

        getMetadataService().addExtension("vnd.myapp.v1", MediaType.valueOf("application/vnd.myapp.v1+json"));
        getMetadataService().addExtension("vnd.myapp.v2", MediaType.valueOf("application/vnd.myapp.v2+json"));

        ...
}

然后按如下方式设置我的资源界面:

public interface UsersResource {

    @Options
    void getCorsSupport();

    @Get("vnd.myapp.v1")
    Collection<User> representV1() throws Exception;

    // Should be the default if */* is specified
    @Get("json | vnd.myapp.v2")
    Collection<User> representV2() throws Exception;

}

然后我尝试按如下方式指定媒体类型:

http://localhost:8080/api/users?media=vnd.myapp.v1

我们的想法是,如果有人将媒体类型指定为vnd.myapp.v1,则会获得representV1()(JSON),如果他们将媒体类型指定为vnd.myapp.v2则会获得representV2()( JSON)和(可选)如果他们没有具体要求他们获得representV2()。通过上述设置,无论请求什么,我总是回来representV2()

2 个答案:

答案 0 :(得分:1)

以下是测试时的内容:

  • Accept: application/vnd.myapp.v1+json - &gt; representV1被称为
  • Accept: application/vnd.myapp.v2+json - &gt; representV2被称为
  • Accept: application/application/json - &gt; representV1被称为
  • Accept: */* - &gt; representV1被称为

表达式json | vnd.myapp.v2似乎无效。解决方法是使用jsonvnd.myapp.v2将representV2拆分为两个方法。

当没有指定accept头时,似乎Restlet调用了第一个带有注释Get的方法。

可以帮助您的一点是启用跟踪以查看不同方法的分数:

public class RestletLauncher {
    public static void main(String[] args) {
        Engine.getInstance().setLogLevel(Level.FINEST);
        launchApplication();
    }
}

你会看到这样的痕迹:

Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetVnd1(), javaClass: class test.MyServerResource1, restletMethod: GET, input: vnd.myapp.v1, value: vnd.myapp.v1, output: vnd.myapp.v1, query: null]"= 0.5
Total score of variant "[application/vnd.myapp.v1+json]"= 0.04191667
Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetJson(), javaClass: class test.MyServerResource1, restletMethod: GET, input: json, value: json, output: json, query: null]"= 0.5
Total score of variant "[application/json]"= 0.04191667
Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetVnd2(), javaClass: class test.MyServerResource1, restletMethod: GET, input: vnd.myapp.v2, value: vnd.myapp.v2, output: vnd.myapp.v2, query: null]"= 0.5
Total score of variant "[application/vnd.myapp.v2+json]"= 0.04191667

希望它可以帮到你, 亨利

答案 1 :(得分:1)

删除注释中的空格字符时会更好,例如:

@Get("json|vnd.myapp.v2")

我已经输入了一个问题来解决这个问题。 https://github.com/restlet/restlet-framework-java/issues/1099

最诚挚的问候,Thierry Boileau