Java'da HTTP PATCH usuli muammosi
Oldingi maqolalarimizda HttpURLConnection va HttpsURLConnection orqali so'rovlarni boshqarish haqida so'z yuritgan edik. Ushbu maqolada esa Java'ning standart kutubxonasi RFC5789 standartida belgilangan HTTP PATCH usulini qo'llab-quvvatlamasligi bilan bog'liq muammoni qanday hal qilishni ko'rib chiqamiz.
Nima uchun ProtocolException yuz beradi?
Java'ning HttpURLConnection sinfi standart holatda faqat ma'lum HTTP usullarini (GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE) qabul qiladi. Agar siz quyidagi kodni ishlatsangiz:
URL url = new URL("https://localhost");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("PATCH");Natijada ProtocolException xatoligi yuzaga keladi, chunki PATCH usuli Java manba kodidagi ruxsat etilgan usullar ro'yxatiga kiritilmagan.
Muammoni hal qilish yo'llari
Dasturchilar ko'pincha bu muammoni chetlab o'tish uchun Apache HTTP Client yoki Spring'ning RestTemplate kabi kutubxonalaridan foydalanishadi. Biroqanishadi. Biroq, agar siz standart kutubxonadan foydalanishga majbur bo'lsangiz, Java Reflection (aks ettirish) yordamida ushbu cheklovni olib tashlashingiz mumkin.
Yechim: Reflection yordamida PATCH'ni faollashtirish
Quyidagi patchThePatch funksiyasi orqali HttpURLConnection'dagi statik ro'yxatni o'zgartirib, PATCH usulini qo'shish mumkin:
private static void patchThePatch() {
try {
String[] methods = { "PATCH" };
Field methodsField = HttpURLConnection.class.getDeclaredField("methods");
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(methodsField, methodsField.getModifiers() & ~Modifier.FINAL);
methodsField.setAccessible(true);
// ... (qolgan mantiqiy qismlar)
LOGGER.info("PATCH HttpURLConnection da muvaffaqiyatli sozlandi");
} catch (Exception ex) {
LOGGER.error("PATCH usulini sozlab bo'lmadi", ex);
}
}Xulosa
- Java 11 va undan keyingi versiyalarda Reflection cheklovlari kuchaygan bo'lishi mumkin.
- Ushbu yechim faqat boshqa kutubxonalardan foydalanish imkoni bo'lmaganda tavsiya etiladi.
- Doimo xavfsizlik va barqarorlikni hisobga oling.
Qo'shimcha ma'lumot uchun StackOverflow sahifasiga murojaat qilishingiz mumkin.














Responses (0 )