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

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

有帮助吗?

解决方案

您是否看过这篇文章?它提供了一个非常全面的实现,用于解析Accept标头,然后对它做一些有用的事情。

其他提示

从.NET 4.5开始(我认为<!>#8212;微软已经在框架版本<!> lt; 4.5上提供了相关信息,而这些日子很难模糊),你可以使用System.Net.Http.Headers的microsoft.com/en-gb/dotnet/api/system.net.http.headers.mediatypewithqualityheadervalue?view=netframework-4.5“rel =”nofollow noreferrer“>其中一个内置解析器

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结果的LINQPad mediaTypes

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

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

在php中找到另一个实现此处

在阅读xml.com文章后,我决定不为自己写一个函数;)

幸运的是,文章指出了一个很好的图书馆: https://code.google.com/p/ mimeparse / - 就我而言,我需要它作为Node.js模块: https://github.com / kriskowal / mimeparse

RFC 非常复杂。如果正则表达式遵循这些规则到字母,它将变成几行长。

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

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

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

https://stackoverflow.com/a/49011308/275501 为基础构建: //stackoverflow.com/users/43140/mark-bell">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" };

    }

}    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top