Pengekodan URL: Mengekalkan Seratan Literal dalam HTTP GET
Dalam permintaan HTTP GET, pengekodan URL adalah penting untuk menghantar aksara khas yang bukan sebahagian daripada set aksara standard. Walau bagaimanapun, apabila laluan URL mengandungi garis miring (/), pelaksanaan GET tertentu secara automatik menterjemahkannya ke dalam sintaks slash berganda (//). Ini boleh menjadi masalah apabila menghantar aksara slash yang dikodkan URL, kerana ia adalah penting untuk pematuhan dengan protokol seperti OCSP melalui HTTP/GET.
Coretan kod berikut menggambarkan isu:
using (WebClient webClient = new WebClient()) { webClient.DownloadData("http://example.com/%2F"); }
Walau bagaimanapun, permintaan sebenar yang dihantar kepada pelayan ialah:
GET // HTTP/1.1 Host: example.com Connection: Keep-Alive
Untuk mengekalkan literal slash dalam HTTP GET, penyelesaian tersuai diperlukan. Berikut ialah coretan kod yang mengubah suai objek Uri untuk mengekalkan laluan dan pertanyaan:
Uri uri = new Uri("http://example.com/%2F"); ForceCanonicalPathAndQuery(uri); using (WebClient webClient = new WebClient()) { webClient.DownloadData(uri); } void ForceCanonicalPathAndQuery(Uri uri){ string paq = uri.PathAndQuery; // need to access PathAndQuery FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); ulong flags = (ulong) flagsFieldInfo.GetValue(uri); flags &= ~((ulong) 0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical flagsFieldInfo.SetValue(uri, flags); }
Dengan mengubah suai objek Uri, laluan terpaksa kekal dalam keadaan asalnya, memastikan bahawa garis miring terpelihara dalam permintaan GET. Penyelesaian ini membolehkan pelaksanaan mematuhi protokol yang memerlukan garis miring berkod URL.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengekalkan Garis Slash Literal dalam Permintaan GET HTTP Dikodkan URL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!