【问题标题】:Parse Accept Header解析接受标头
【发布时间】:2010-09-20 07:18:51
【问题描述】:

是否有人对解析 HTTP Accept 标头有任何建议(或正则表达式)?

我正在尝试在 ASP.NET MVC 中进行一些内容类型协商。似乎没有内置的方式(这很好,因为这里有很多思想流派),但是解析并不是完全微不足道的,如果有人已经做过,我宁愿不重新发明轮子很好,愿意分享。

【问题讨论】:

  • 好问题 - 我也在另一个项目中寻找这个!

标签: asp.net regex http http-headers


【解决方案1】:

https://stackoverflow.com/a/49011308/275501 为基础,来自上述https://stackoverflow.com/users/43140/mark-bell

public class MyController : Controller
{

    [HttpGet]
    [Route("/test")]
    public ActionResult Index() {

        // does this request accept HTML?
        var acceptsHTML = IsAcceptable("text/html");
        var model = FetchViewModel();
        return acceptsHTML ? (ActionResult) View(model) : Ok(model);

    }

    private bool IsAcceptable(string mediaType) =>
        Request.Headers["Accept"].Any(headerValue =>
            !string.IsNullOrWhiteSpace(headerValue) &&
            headerValue.Split(",").Any(segment => MediaTypeHeaderValue.Parse(segment).MediaType == mediaType));

    private object FetchViewModel() {

        return new { Description = "To be completed" };

    }

}    

【讨论】:

    【解决方案2】:

    从 .NET 4.5 开始(我认为,微软现在已经使 System.Net.Http.Headers 的 one of the the built in parsers

    public IOrderedEnumerable<MediaTypeWithQualityHeaderValue> GetMediaTypes(string headerValue) =>
        headerValue?.Split(',')
            .Select(MediaTypeWithQualityHeaderValue.Parse)
            .OrderByDescending(mt => mt.Quality.GetValueOrDefault(1));
    

    然后你可以这样做:

    var headerValue = "application/json, text/javascript, */*; q=0.01";
    var mediaTypes = GetMediaTypes(headerValue);
    

    为您提供所有媒体类型的精美列表,其中 preferred 选项是第一项。这是示例中mediaTypes 结果的 LINQPad Dump

    this answer 致敬,让我走上正轨。

    【讨论】:

      【解决方案3】:

      阅读 xml.com 文章后,我决定自己不为 Accept 标头编写函数;)

      幸运的是,这篇文章指出了一个很好的库:https://code.google.com/p/mimeparse/ - 在我的情况下,我需要它作为 Node.js 模块:https://github.com/kriskowal/mimeparse

      【讨论】:

        【解决方案4】:

        在 php 中找到另一个实现 here

        【讨论】:

          【解决方案5】:

          我在 PHP 中有 written a parser。它并不复杂,但它会按优先顺序为您提供一系列 mime 类型。

          【讨论】:

          • 链接的网站被“禁用”
          【解决方案6】:

          你见过this article吗?它提供了一个非常全面的实现来解析 Accept 标头并随后用它做一些有用的事情。

          【讨论】:

            【解决方案7】:

            RFC 相当复杂。如果正则表达式在哪里遵循这些规则来写信,就会变成好几行。

            如果您已经有 Accept-header,并忽略引号和参数,您可以执行以下操作来匹配每一对:

            /([^()<>@,;:\\"\/[\]?={} \t]+)\/([^()<>@,;:\\"\/[\]?={} \t]+)/
            

            * 包含在字符类中,因此在正则表达式中不需要任何特殊情况。

            【讨论】:

              猜你喜欢
              • 2015-09-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-11
              • 2010-11-08
              • 2019-10-08
              • 2010-09-09
              • 1970-01-01
              相关资源
              最近更新 更多