【问题标题】:How parse an http accept header in spring?spring 如何解析一个http接受头?
【发布时间】:2020-03-15 17:45:02
【问题描述】:

我想在 Spring 中解析 HTTP 接受标头以确定是否可以发回 JSON。我正在尝试使用以下代码。

class MediaTypeUtil {
  private final static Logger logger = LoggerFactory.getLogger(MediaTypeUtil.class);
  static boolean acceptsJson(HttpServletRequest request) {
    try {
      String accept = request.getHeader("Accept");
      MediaType requestType = MediaType.valueOf(accept);
      return MediaType.APPLICATION_JSON.isCompatibleWith(requestType);
    } catch (InvalidMediaTypeException e) {
      logger.debug("MediaType parsing error",e);
      return false;
    }
  }
}

当一个接受标头值为application/json, application/javascript, text/javascript, text/json的请求到达时,我最终会遇到异常

Caused by: org.springframework.util.InvalidMimeTypeException: Invalid mime type "application/json, application/javascript, text/javascript, text/json": Invalid token character ',' in token "json, application/javascript, text/javascript, text/json"
    at org.springframework.util.MimeTypeUtils.parseMimeTypeInternal(MimeTypeUtils.java:262)

这段代码是从 Servlet 过滤器中使用的,所以我不能依赖 SpringMVC 注释。

Spring 是否有解析接受头并确定它是否与特定媒体类型兼容的方法?

【问题讨论】:

  • 为什么不简单地将注释@RequestMappingconsumesproduces 一起使用?
  • 顺便说一句:你会得到一个逗号分隔的列表作为接受标题。你可以在,拆分它并解析它的每一部分
  • 此代码位于 servlet 过滤器中,因此可以访问 @RequestMapping,是的,我可以拆分字符串,但我认为此功能已经在 spring 中的某个地方,我宁愿重用它,因为它可能正确处理极端情况。

标签: java spring spring-mvc


【解决方案1】:

Spring 本身在内部的执行方式与您完全一样(即从请求中获取 ACCEPT 标头),但它们会将其提供给此调用:

MediaType.parseMediaTypes(get(ACCEPT));

这将返回您需要使用的List<MediaType>

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2013-06-12
    • 2010-09-09
    相关资源
    最近更新 更多