在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()
。
答案 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
似乎无效。解决方法是使用json
和vnd.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