是否有人有任何建议(或正则表达式)来解析HTTP Accept标头?
我正在尝试在ASP.NET MVC中进行一些内容类型协商。似乎没有内置方式(这很好,因为这里有很多思想流派),但解析并不是完全无关紧要的,如果有人已经完成,我宁愿不重新发明轮子很好,并愿意分享。
答案 0 :(得分:9)
你见过this article吗?它提供了一个非常全面的实现,用于解析Accept标头,然后对它做一些有用的事情。
答案 1 :(得分:4)
从.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);
为您提供所有媒体类型的精彩列表,其中首选选项是第一项。以下是示例中Dump
结果的LINQPad mediaTypes
:
给我this answer提示,让我走上正轨。
答案 2 :(得分:3)
我在PHP中written a parser。它并不复杂,但它会按照优先顺序为您提供一系列mime类型。
答案 3 :(得分:1)
在php here
中找到另一个实现答案 4 :(得分:1)
在阅读xml.com文章后,我决定不为自己写一个函数;)
幸运的是,文章指出了一个好的库:https://code.google.com/p/mimeparse/ - 在我的情况下,我需要它作为Node.js模块:https://github.com/kriskowal/mimeparse
答案 5 :(得分:0)
RFC非常复杂。如果正则表达式遵循这些规则到字母,它将变成几行长。
如果您已经拥有Accept-header,并忽略引号和参数,您可以执行以下操作来匹配每对:
/([^()<>@,;:\\"\/[\]?={} \t]+)\/([^()<>@,;:\\"\/[\]?={} \t]+)/
*
包含在字符类中,因此在正则表达式中不需要任何特殊情况。
答案 6 :(得分:0)
以上方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" };
}
}