문제

누구든지 HTTP 수락 헤더를 구문 분석 할 제안 (또는 정규 표현)이 있습니까?

ASP.NET MVC에서 콘텐츠 유형 협상을하려고합니다. 구축 된 방식이없는 것 같지만 (여기에는 많은 생각의 학교가 있기 때문에 괜찮습니다), 구문 분석은 완전히 사소한 것이 아니며 누군가가 이미 완료 한 경우 바퀴를 다시 발명하지 않을 것입니다. 그것은 잘하고 기꺼이 공유 할 것입니다.

도움이 되었습니까?

해결책

당신은 본 적이 있습니다 이 기사? 수락 헤더를 구문 분석하고 그에 유용한 일을하는 데있어 매우 포괄적 인 구현을 제공합니다.

다른 팁

.NET 4.5 기준 (내 생각 - Microsoft는 프레임 워크 버전에 대한 정보를 만들었습니다. <4.5 요즘에는 모호합니다) 내장 된 파서 중 하나 ~에서 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가 있습니다 DumpmediaTypes 예에서 결과 :

LINQPad dump of results

모자 팁 이 답변, 나를 올바른 길로 데려가는 것.

나는 파서를 작성했습니다 PHP에서. 복잡하지는 않지만 선호하는 순서대로 마임 유형의 배열을 제공합니다.

PHP에서 또 다른 구현을 찾았습니다 여기

XML.com 기사를 읽은 후 나는 수락 헤더에 대한 기능을 작성하지 않기로 결정했습니다.)

다행히이 기사는 좋은 도서관을 가리 킵니다. https://code.google.com/p/mimeparse/ - 내 경우에는 node.js 모듈로 필요합니다. https://github.com/kriskowal/mimeparse

그만큼 RFC 상당히 복잡합니다. 이 규칙을 문자로 따라야 할 곳이있는 곳이 있다면, 몇 줄이 길어질 것입니다.

이미 허가서가 있고 따옴표와 매개 변수를 무시하는 경우 각 쌍과 일치하도록 이와 같은 작업을 수행 할 수 있습니다.

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

* 캐릭터 클래스에 포함되므로 Regex에서 특별한 경우가 필요하지 않습니다.

빌딩 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" };

    }

}    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top