[英]Restlet using custom media type
In Restlet 2.3 (SE) I am trying to use media types to control versions. 在Restlet 2.3(SE)中,我试图使用媒体类型来控制版本。 My current attempt involves registering new extensions in my inbound route: 我当前的尝试涉及在入站路由中注册新的扩展:
@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"));
...
}
My resource interface is then setup as follows: 然后,按如下所示设置我的资源接口:
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;
}
I then tried specifying the media types as follows: 然后,我尝试如下指定媒体类型:
http://localhost:8080/api/users?media=vnd.myapp.v1
The idea is that if somebody specifies the media type as vnd.myapp.v1
they get representV1()
(JSON), if they specify the media type as vnd.myapp.v2
they get representV2()
(JSON) and (optionally) if they ask for nothing specific they get representV2()
. 这个想法是,如果有人将媒体类型指定为vnd.myapp.v1
它们将得到representV1()
vnd.myapp.v1
representV1()
(JSON),如果他们将媒体类型指定为vnd.myapp.v2
,则它们将得到vnd.myapp.v2
representV2()
(JSON),并且(可选)他们不要求任何特定的东西,他们得到了representV2()
。 With the above setup no matter what is requested I always get back representV2()
. 通过上面的设置,无论请求什么,我总是会返回representV2()
。
Here is what I had when testing: 这是我测试时得到的:
Accept: application/vnd.myapp.v1+json
-> representV1
is called Accept: application/vnd.myapp.v1+json
> representV1
Accept: application/vnd.myapp.v1+json
被调用 Accept: application/vnd.myapp.v2+json
-> representV2
is called Accept: application/vnd.myapp.v2+json
> representV2
Accept: application/vnd.myapp.v2+json
被调用 Accept: application/application/json
-> representV1
is called Accept: application/application/json
> representV1
Accept: application/application/json
被调用 Accept: */*
-> representV1
is called Accept: */*
-> representV1
被调用 It seems that the expression json | vnd.myapp.v2
似乎表达式json | vnd.myapp.v2
json | vnd.myapp.v2
doesn't work properly. json | vnd.myapp.v2
无法正常工作。 The workaround is to split representV2 into two methods with json
and vnd.myapp.v2
. 解决方法是使用json
和vnd.myapp.v2
分为两个方法。
When no accept header is specified, it seems that Restlet calls the first method with annotation Get
it finds. 当没有指定accept头时,Restlet似乎会调用第一个带有注解Get
it find的方法。
Something that could help you is to enable traces to see the scores of the different methods: 可以帮助您启用跟踪功能以查看不同方法的分数的方法是:
public class RestletLauncher {
public static void main(String[] args) {
Engine.getInstance().setLogLevel(Level.FINEST);
launchApplication();
}
}
You'll see traces like that: 您会看到类似的痕迹:
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
Hope it helps you, Thierry 希望对您有帮助,蒂埃里
It gets better when removing the spaces character in the annotation such as: 在注释中删除空格字符时,效果会更好:
@Get("json|vnd.myapp.v2")
I've entered an issue to fix this. 我输入了一个问题来解决此问题。 https://github.com/restlet/restlet-framework-java/issues/1099 https://github.com/restlet/restlet-framework-java/issues/1099
best regards, Thierry Boileau 此致Thierry Boileau
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.