有没有人对解析HTTP Accept头有任何建议(或正则表达式)?我正在尝试在ASP.NET MVC中进行一些内容类型协商。似乎没有一种内置的方式(这很好,因为这里有很多思想流派),但解析并不完全是微不足道的,如果有人已经做得很好并愿意分享,我宁愿不重新发明轮子。
qco9c6ql1#
你看过this article吗?它提供了一个非常全面的实现,用于解析Accept头,并随后使用它做一些有用的事情。
9avjhtql2#
从.NET 4.5开始(我认为微软最近对低于4.5的框架版本的信息做了相当模糊的处理),您可以从System.Net.Http.Headers使用one of the the built in parsers:
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);
给你一个所有媒体类型的列表,其中 preferred 选项是第一项。下面是示例中mediaTypes结果的LINQPad Dump:
mediaTypes
Dump
给这个答案的帽子提示,让我走上了正确的道路。
2j4z5cfb3#
我用PHP编写了written a parser,它并不复杂,但它会按照偏好的顺序给予你一个mime类型数组。
rmbxnbpk4#
在php here中找到另一个实现
fquxozlt5#
在阅读了www.example.com上的文章后xml.com,我决定不为Accept头写函数;)幸运的是,这篇文章指出了一个很好的库:https://code.google.com/p/mimeparse/-在我的情况下,我需要它作为Node.js模块:https://github.com/kriskowal/mimeparse
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" }; } }
ncecgwcz7#
RFC是相当复杂的。如果正则表达式在哪里遵循这些规则的信,它将成为几行长。如果你已经有了Accept-header,并且忽略了引号和参数,你可以这样做来匹配每一对:
/([^()<>@,;:\\"\/[\]?={} \t]+)\/([^()<>@,;:\\"\/[\]?={} \t]+)/
*包含在字符类中,因此在正则表达式中不需要任何特殊情况。
*
htrmnn0y8#
我知道这是一个老问题,但对于像我一样使用ASP.NET Core的人来说,请注意,您可以在Request(或Response)对象上使用GetTypedHeaders扩展方法来获取强类型的头信息,包括Accept:
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...
8条答案
按热度按时间qco9c6ql1#
你看过this article吗?它提供了一个非常全面的实现,用于解析Accept头,并随后使用它做一些有用的事情。
9avjhtql2#
从.NET 4.5开始(我认为微软最近对低于4.5的框架版本的信息做了相当模糊的处理),您可以从
System.Net.Http.Headers
使用one of the the built in parsers:然后你可以这样做:
给你一个所有媒体类型的列表,其中 preferred 选项是第一项。下面是示例中
mediaTypes
结果的LINQPadDump
:给这个答案的帽子提示,让我走上了正确的道路。
2j4z5cfb3#
我用PHP编写了written a parser,它并不复杂,但它会按照偏好的顺序给予你一个mime类型数组。
rmbxnbpk4#
在php here中找到另一个实现
fquxozlt5#
在阅读了www.example.com上的文章后xml.com,我决定不为Accept头写函数;)
幸运的是,这篇文章指出了一个很好的库:https://code.google.com/p/mimeparse/-在我的情况下,我需要它作为Node.js模块:https://github.com/kriskowal/mimeparse
hsvhsicv6#
基于https://stackoverflow.com/a/49011308/275501构建,基于上面的https://stackoverflow.com/users/43140/mark-bell:
ncecgwcz7#
RFC是相当复杂的。如果正则表达式在哪里遵循这些规则的信,它将成为几行长。
如果你已经有了Accept-header,并且忽略了引号和参数,你可以这样做来匹配每一对:
*
包含在字符类中,因此在正则表达式中不需要任何特殊情况。htrmnn0y8#
ASP.NET Core解决方案:
我知道这是一个老问题,但对于像我一样使用ASP.NET Core的人来说,请注意,您可以在
Request
(或Response
)对象上使用GetTypedHeaders
扩展方法来获取强类型的头信息,包括Accept
: