如何从请求中获取 MediaType

How to get MediaType from Request

我正在使用 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,这对我不起作用)从请求中构建,这样我就不需要做这些如果- else 语句在捕获各种媒体类型方面非常有限。

为什么需要确定媒体类型?通常,当你在 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);
}

等...

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

例如,在 ServerResource class 函数中:

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

您以最适用的方式提供受支持列表的位置 MediaTypes

Restlet根据Content-Typeheader获取请求的媒体类型。对于值,可以这样用:

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

ClientInfo 的媒体类型提示对应于 Accept header:

中提供的内容
getRequest().getClientInfo().getAcceptedMediaTypes();

要在 Restlet API 中获取 header 的映射,您可以查看此 link: