【问题标题】:How to get MediaType from Request如何从请求中获取 MediaType
【发布时间】:2016-02-13 18:34:17
【问题描述】:

我正在使用 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 语句这在捕获各种媒体类型方面非常有限。

【问题讨论】:

    标签: java restlet


    【解决方案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);
    }
    

    等等……

    【讨论】:

      【解决方案2】:

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

      例如,在ServerResource 类函数中:

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

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

      【讨论】:

      • 这就像getPreferredMediaType(null); ?
      • @xybrek 目前是的,我离开提供您支持的MediaTypes 列表,因为您可能希望对其进行硬编码,从静态常量或其他方式获取它最简单的解决方案是Arrays.asList(MediaType.TEXT_HTML, MediaType.TEXT_CSS, ..., etc);,但我在您的问题中没有足够的上下文来表明这是正确的。基本上用您支持的类型列表替换上面的null
      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-18
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 2013-05-30
        • 2019-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多