Hi Rodion,
Assuming that you have now migrated to Restlet 2.0 M5 (it should work in 2.0 M4
though), I would write my resource this way:
@Get("xml")
public Representation representAsXml(){
...
}
@Get("json")
public JSONObject representAsJson(){
return XML.toJSONObject("…");
}
Best regards,
Jerome Louvel
--
Restlet ~ Founder and Lead developer ~ http://www.restlet.org
Noelios Technologies ~ Co-founder ~ http://www.noelios.com
-----Message d'origine-----
De : Rodion Mrt [mailto:[email protected]]
Envoyé : mercredi 16 septembre 2009 18:55
À : [email protected]
Objet : Restlet 2, milestone 4. Handling variants.
Hi, I'm having a problem with returning a proper resource representation based
on the request Accept header value.
I'd like to return 2 representations: String or JSON base on corresponding
request media types: ALL, APPLICATION_JSON.
My understanding is that I have to add supported variants in my server resource
code like this:
protected void doInit() throws ResourceException {
getVariants().put(Method.GET,
Arrays.asList(new Variant[]{
new Variant(MediaType.ALL),
new Variant(MediaType.APPLICATION_JSON)
}));
}
I check the request media type in the @Get method and build a proper
representation:
@Get
public Representation getRepresentation(Variant variant) throws JSONException {
Representation result = null;
if(mtype.equals(MediaType.ALL)) {
// Return XML representation
result = new StringRepresentation("…");
} else if(mtype.equals(MediaType.APPLICATION_JSON)) {
// Return JSON representation
result = new StringRepresentation(XML.toJSONObject("…").toString());
} else {
setStatus(Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
// Generate error representation here
}
return result;
}
In my Restlet test client I run 2 test requests expecting to get 2 different
representations like this:
Public void foo() {
ClientResource poiResource = new ClientResource("http://myhost:myport/path");
Representation rep = poiResource.get(MediaType.ALL);
if(!(poiResource.getStatus().isSuccess() &&
poiResource.getResponseEntity().isAvailable())) {
fail("The request has failed: " + rep.getText());
}
rep = poiResource.get(MediaType.APPLICATION_JSON);
if(!(poiResource.getStatus().isSuccess() &&
poiResource.getResponseEntity().isAvailable())) {
fail("The request has failed: " + rep.getText());
}
}
But I got 2 problems with that:
1. After I add the varian adding code all my requests fail with "The method
specified in the request is not allowed for the resource identified by the
request URI"
2. If I remove variant adding code from server resource Init() method, no
matter what media type I specify in a client resource, in the server resource's
@Get method the value of the 'variant' argument is always MEdiaType.ALL.
Am I doing something wrong?
Thanks!
------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2395647
------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2402849