Restlet不区分不同的Accept Headers

时间:2014-09-05 17:33:15

标签: java restlet restlet-2.0

在我的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,那么这个请求的分数应该会上升......

1 个答案:

答案 0 :(得分:0)

是的,您在注释中使用了错误的值。实际上,该值对应于Restlet调用扩展名。后者映射一组媒体类型。例如:

  • 扩展程序xml映射在媒体类型application/xmltext/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

希望它可以帮到你, 亨利