使用自定义媒体类型的 Restlet
Restlet using custom 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()
。
这是我测试时的结果:
Accept: application/vnd.myapp.v1+json
-> representV1
被称为
Accept: application/vnd.myapp.v2+json
-> representV2
被称为
Accept: application/application/json
-> representV1
被称为
Accept: */*
-> representV1
被称为
似乎表达式json | vnd.myapp.v2
不能正常工作。解决方法是将 representV2 拆分为 json
和 vnd.myapp.v2
.
两种方法
当没有指定 accept header 时,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
希望对你有帮助,
蒂埃里
删除注释中的空格字符会变得更好,例如:
@Get("json|vnd.myapp.v2")
我已输入问题来解决此问题。 https://github.com/restlet/restlet-framework-java/issues/1099
此致,Thierry Boileau
在 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()
。
这是我测试时的结果:
Accept: application/vnd.myapp.v1+json
->representV1
被称为Accept: application/vnd.myapp.v2+json
->representV2
被称为Accept: application/application/json
->representV1
被称为Accept: */*
->representV1
被称为
似乎表达式json | vnd.myapp.v2
不能正常工作。解决方法是将 representV2 拆分为 json
和 vnd.myapp.v2
.
当没有指定 accept header 时,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
希望对你有帮助, 蒂埃里
删除注释中的空格字符会变得更好,例如:
@Get("json|vnd.myapp.v2")
我已输入问题来解决此问题。 https://github.com/restlet/restlet-framework-java/issues/1099
此致,Thierry Boileau