سؤال

هل لديها أي اقتراحات (أو تعبير عادي) للتحليل HTTP اقبل رأس؟

وأنا أحاول القيام ببعض التفاوض نوع المحتوى في ASP.NET MVC. لا يبدو أن يكون بنيت في الطريق (وهذا أمر جيد، لأن هناك الكثير من المدارس الفكرية هنا)، ولكن إعراب ليست تافهة تماما وأنا لا ترغب في إعادة اختراع العجلة إذا كان شخص ما قد فعلت ذلك جيدا وعلى استعداد للمشاركة.

هل كانت مفيدة؟

المحلول

هل رأيت href="http://www.xml.com/pub/a/2005/06/08/restful.html" هذه المقالة ؟ أنه يعطي التنفيذ الشامل جدا لتحليل تحمل رأس والقيام بعد ذلك شيئا مفيدا معها.

نصائح أخرى

واعتبارا من. NET 4.5 (على ما أظن، مايكروسوفت قد جعلت من المعلومات على إصدارات إطار <4.5 غامضة نوعا ما هذه الأيام)، يمكنك استخدام <لأ href = "https://docs.microsoft.com/en-gb/dotnet /api/system.net.http.headers.mediatypewithqualityheadervalue؟view=netframework-4.5 "يختلط =" نوفولو 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);

وإعطاء لك قائمة لطيفة من جميع أنواع وسائل الإعلام، حيث <م> فضل الخيار هو العنصر الأول. وهنا Dump LINQPad النتيجة mediaTypes من المثال:

وهات تلميح إلى <لأ href = "https://stackoverflow.com/questions/9927871/need-an-example-on-how-to-get-preferred-language-from-accept-language-request-he # 27585837 "> هذه الإجابة ، للحصول لي على الطريق الصحيح.

ولقد كتب محلل في PHP. انها ليست معقدة، لكنها ستعطي لك مجموعة من أنواع التمثيل الصامت في ترتيب الأفضلية.

وجدت تنفيذ آخر في بي هنا

وبعد قراءة المقال xml.com قررت أن لا أكتب وظيفة للرأس قبول نفسي.)

ولحسن الحظ النقاط المقال إلى مكتبة جيدة: https://code.google.com/p/ mimeparse / - في حالتي أنا في حاجة إليها بوصفها وحدة نود.جي إس: https://github.com / kriskowal / mimeparse

RFC عبارة معقدة جدا. إذا التعبير المعتاد حيث لاتباع هذه القواعد لهذه الرسالة، فإنه سيصبح عدة خطوط طويلة.

إذا كان لديك بالفعل، رأس قبول، وتجاهل ونقلت والمعلمات، هل يمكن أن تفعل شيئا من هذا القبيل لتتناسب مع كل زوج:

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

ويتم تضمين * في فئة الطابع، لذلك لا تحتاج إلى أي حالة خاصة في التعبير العادي.

وبناء على https://stackoverflow.com/a/49011308/275501 من <لأ href = "HTTPS: //stackoverflow.com/users/43140/mark-bell">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