26

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

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

4

7 回答 7

9

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

于 2008-11-01T16:50:42.277 回答
7

从 .NET 4.5 开始(我认为微软已经使框架版本 < 4.5 的信息变得晦涩难懂),您可以使用以下内置解析器之一System.Net.Http.Headers

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);

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

LINQPad 转储结果

提示这个答案,让我走上正轨。

于 2018-02-27T14:42:20.917 回答
3

我用 PHP编写了一个解析器。它并不复杂,但它会按优先顺序为您提供一系列 mime 类型。

于 2009-04-24T08:16:20.837 回答
1

在 php here中找到另一个实现

于 2011-02-15T10:04:13.727 回答
1

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

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

于 2013-01-30T13:15:32.270 回答
1

https://stackoverflow.com/users/43140/mark-bellhttps://stackoverflow.com/a/49011308/275501为基础:

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" };

    }

}    
于 2018-10-15T09:13:49.583 回答
0

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

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

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

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

于 2008-11-01T04:48:32.013 回答