【问题标题】:Parse Accept Header解析接受标头
【发布时间】:2010-09-20 07:18:51
【问题描述】:
是否有人对解析 HTTP Accept 标头有任何建议(或正则表达式)?
我正在尝试在 ASP.NET MVC 中进行一些内容类型协商。似乎没有内置的方式(这很好,因为这里有很多思想流派),但是解析并不是完全微不足道的,如果有人已经做过,我宁愿不重新发明轮子很好,愿意分享。
【问题讨论】:
标签:
asp.net
regex
http
http-headers
【解决方案1】:
以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" };
}
}
【解决方案2】:
从 .NET 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:
向this answer 致敬,让我走上正轨。
【解决方案7】:
RFC 相当复杂。如果正则表达式在哪里遵循这些规则来写信,就会变成好几行。
如果您已经有 Accept-header,并忽略引号和参数,您可以执行以下操作来匹配每一对:
/([^()<>@,;:\\"\/[\]?={} \t]+)\/([^()<>@,;:\\"\/[\]?={} \t]+)/
* 包含在字符类中,因此在正则表达式中不需要任何特殊情况。