regex 解析接受标头

gxwragnw  于 2023-03-31  发布在  其他
关注(0)|答案(8)|浏览(119)

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

qco9c6ql

qco9c6ql1#

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

9avjhtql

9avjhtql2#

从.NET 4.5开始(我认为微软最近对低于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

给这个答案的帽子提示,让我走上了正确的道路。

2j4z5cfb

2j4z5cfb3#

我用PHP编写了written a parser,它并不复杂,但它会按照偏好的顺序给予你一个mime类型数组。

rmbxnbpk

rmbxnbpk4#

在php here中找到另一个实现

fquxozlt

fquxozlt5#

在阅读了www.example.com上的文章后xml.com,我决定不为Accept头写函数;)
幸运的是,这篇文章指出了一个很好的库:https://code.google.com/p/mimeparse/-在我的情况下,我需要它作为Node.js模块:https://github.com/kriskowal/mimeparse

hsvhsicv

hsvhsicv6#

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

    }

}
ncecgwcz

ncecgwcz7#

RFC是相当复杂的。如果正则表达式在哪里遵循这些规则的信,它将成为几行长。
如果你已经有了Accept-header,并且忽略了引号和参数,你可以这样做来匹配每一对:

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

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

htrmnn0y

htrmnn0y8#

ASP.NET Core解决方案:

我知道这是一个老问题,但对于像我一样使用ASP.NET Core的人来说,请注意,您可以在Request(或Response)对象上使用GetTypedHeaders扩展方法来获取强类型的头信息,包括Accept

using Microsoft.AspNetCore.Http;

var accept = Request.GetTypedHeaders().Accept; // `Request` must be an `HttpRequest` instance
accept[0].MediaType
accept[0].Quality
// And so on...

相关问题