Parse Accept Header - PullRequest
       21

Parse Accept Header

24 голосов
/ 01 ноября 2008

Есть ли у кого-нибудь предложения (или регулярное выражение) для анализа заголовка HTTP Accept?

Я пытаюсь выполнить некоторые согласования типов содержимого в ASP.NET MVC. Кажется, что не существует встроенного способа (и это хорошо, потому что здесь много идей), но разбор не совсем тривиален, и я бы не стал заново изобретать колесо, если кто-то уже сделал это хорошо и готов поделиться.

Ответы [ 7 ]

9 голосов
/ 01 ноября 2008

Вы видели эту статью ? Это дает довольно полную реализацию для анализа заголовка Accept и последующего использования чего-то полезного.

4 голосов
/ 27 февраля 2018

Начиная с .NET 4.5 (я думаю, что Microsoft сделала информацию о версиях платформы <4.5 довольно неясной в наши дни), вы можете использовать <a href="https://docs.microsoft.com/en-gb/dotnet/api/system.net.http.headers.mediatypewithqualityheadervalue?view=netframework-4.5" rel="nofollow noreferrer"> один из встроенных парсеров из 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);

Предоставляет вам хороший список всех типов мультимедиа, где предпочтительный вариант является первым элементом. Вот LINQPad Dump результата mediaTypes из примера:

LINQPad dump of results

Шляпа, подсказывающая этот ответ , за то, что я на правильном пути.

3 голосов
/ 24 апреля 2009

Я написал парсер на PHP. Это не сложно, но даст вам массив типов пантомимы в порядке предпочтения.

1 голос
/ 30 января 2013

Прочитав статью на xml.com, я решил сам не писать функцию для заголовка Accept;)

К счастью, статья указывает на хорошую библиотеку: https://code.google.com/p/mimeparse/ - в моем случае она мне нужна как модуль Node.js: https://github.com/kriskowal/mimeparse

1 голос
/ 15 февраля 2011

Найдена другая реализация в php здесь

0 голосов
/ 15 октября 2018

Построение 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" };

    }

}    
0 голосов
/ 01 ноября 2008

RFC довольно сложный. Если регулярное выражение, где следовать этим правилам в письме, оно станет длиной в несколько строк.

Если у вас уже есть заголовок Accept и вы игнорируете кавычки и параметры, вы можете сделать что-то вроде этого, чтобы соответствовать каждой паре:

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

* входит в класс символов, поэтому в регулярном выражении он не нуждается ни в каком особом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...