如何从请求中获取MediaType

时间:2016-02-13 18:34:17

标签: java restlet

我正在使用Restlet构建某种代理服务器,但是我遇到了一个问题,即没有根据客户端请求自动确定MediaType的方法。

这是我的代码:

Representation entity = null;
entity.setMediaType(processMediaType(path));

处理媒体类型:

private MediaType processMediaType(String path){
    MediaType type = MediaType.ALL;
    if(path.endsWith("html")){
        type = MediaType.TEXT_HTML;
    } else if (path.endsWith("css")) {
        type = MediaType.TEXT_CSS;
    } else if (path.endsWith("js")) {
        type = MediaType.TEXT_JAVASCRIPT;
    } else if (path.endsWith("txt")) {
        type = MediaType.TEXT_PLAIN;
    } else if (path.endsWith("jpg")){
        type = MediaType.IMAGE_JPEG;
    } else if (path.endsWith("png")){
        type = MediaType.IMAGE_PNG;
    }
    return type;
}

我想知道MediaType是否可以由框架自动构建(或者从请求获取MediaType,这对我来说不起作用),这样我就不需要执行这些if-else语句了这在捕捉各种媒体类型方面非常有限。

3 个答案:

答案 0 :(得分:1)

为什么需要确定媒体类型?通常,当您在java中构造rest api时,可以为每种允许的媒体类型创建单独的方法,即

@Path("<your_path>")
@Consumes (MediaType.XML)
@Produces (MediaType.XML)
public Response processXMLRequest (...){
    //a more general method to process all request
    return processRequest (request, MediaType.XML);
}


@Path("<your_path>")
@Consumes (MediaType.JSON)
@Produces (MediaType.JSON)
public Response processXMLRequest (...){
    //a more general method to process all request
    return processRequest (request, MediaType.JSON);
}
等等......

答案 1 :(得分:1)

如果您需要,可以在ClientInfo对象中找到此信息  在请求中。使用Restlet用于进行内容协商的相同机制,Em Ae也自动回答。

例如,在ServerResource类函数中:

    List<MediaType> supported = null;
    MediaType type = getRequest().getClientInfo().getPreferredMediaType(supported);

以最适用的方式提供支持的MediaTypes列表。

答案 2 :(得分:0)

Restlet根据Content-Type标头获取请求的媒体类型。对于该值,您可以使用:

MediaType mediaType = getRequest().getEntity().getMediaType();

ClientInfo的媒体类型提示对应于Accept标题中提供的内容:

getRequest().getClientInfo().getAcceptedMediaTypes();

要获取Restlet API中标头的映射,您可以查看以下链接: