在我的ServerResource中有两个不同的“Get-Functions”
public class ApiKeyRestlet extends ServerResource {
@Get("json:json")
public ApiKeyResponse apikeyAsJson() throws RecordDoesNotExist {
...
}
@Get("text:text")
public Representation apikeyAsFile() throws RecordDoesNotExist {
...
Representation representation = new StringRepresentation(data, MediaType.TEXT_PLAIN);
Disposition disposition = new Disposition(Disposition.TYPE_ATTACHMENT);
disposition.setFilename("apikey.properties");
representation.setDisposition(disposition);
return representation;
}
...
路径... / apikey绑定到ApiKeyRestlet。如果客户端发送Accept:text / plain,则应调用apikeyAsFile,如果客户端发送Accept:application / json,apikeyAsJson应该生效。但是我可以将我想要的东西作为Accept-Header发送,它总是被称为apikeyAsJson。
我认为这两种格式兼容,但我该如何处理呢?我不想为此定义两种不同的路线。
[更新]
我通过代码进行了调试,发现Representation的返回类型添加了默认的MediaType [*/*]
。得分总是0.5,因此总是会调用ServerResource中定义的第一个函数 - 似乎是一个bug?如果我定义了一个Accept-Header,那么这个请求的分数应该会上升......
答案 0 :(得分:0)
是的,您在注释中使用了错误的值。实际上,该值对应于Restlet调用扩展名。后者映射一组媒体类型。例如:
xml
映射在媒体类型application/xml
和text/xml
txt
映射在媒体类型text/plain
您可以在方法MetadataService#addCommonExtensions
级别访问javadocs(http://restlet.com/technical-resources/restlet-framework/javadocs/2.2/jse/api/)中的所有受支持的扩展程序。此方法负责注册所有支持的扩展。
在你的情况下,我会像这样重构你的代码:
public class ApiKeyRestlet extends ServerResource {
@Get("json")
public ApiKeyResponse apikeyAsJson() throws RecordDoesNotExist {
(...)
}
@Get("txt")
public Representation apikeyAsFile() throws RecordDoesNotExist {
(...)
}
}
如果标头apikeyAsJson
包含Accept
,方法application/json
包含apikeyAsFile
,则会调用方法text/plain
。
希望它可以帮到你, 亨利