2009-06-03 9 views
11

मैं एक प्रोजेक्ट पर काम कर रहा हूं जहां मैं http क्लाइंट अनुरोधों को चलाने के लिए कक्षा बना रहा हूं (मेरी कक्षा क्लाइंट के रूप में कार्य करती है)। यह एक यूआरएल और एक अनुरोध विधि (GET, POST, PUT, आदि) लेता है और मैं यूआरएल को पार्स करने में सक्षम होना चाहता हूं और एचटीपीएसआरकनेक्शन या HttpURLConnection को खोलना चाहता हूं कि यह https या http है (मान लें कि दिए गए यूआरएल हमेशा होंगे सही बात)।जावा में, यूआरएल के आधार पर HttpsURLConnection या HttpURLConnection कैसे बनाएं?

मैं निम्नलिखित करते हैं:

URLConnection conn = url.openConnection(); 
कि स्वचालित रूप से एक URLConnection कि http और https दोनों स्वीकार कर सकते हैं पैदा करेगा, लेकिन अगर मैं ऐसा करने तो मैं एक अनुरोध विधि सेट करने के लिए किसी भी तरह से नहीं मिल रहा है तो फिर

(प्राप्त करें, पोस्ट करें, आदि), क्योंकि केवल HttpsURLConnection या HttpURLConnection कक्षाओं में setRequestMethod विधि है।

मैं निम्नलिखित की तरह कुछ करते हैं:

if(is_https) 
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
else 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

फिर कनेक्शन बनाई गई हैं, लेकिन मैं उन्हें अगर ब्लॉक के बाहर तक नहीं पहुँच सकता।

क्या ऐसा करना संभव है, या क्या मुझे छोड़ देना चाहिए और अपाचे httpclient कक्षाओं का उपयोग करना चाहिए?

+5

बस * पहले परिभाषित * Conn * यदि * बयान। आपको परिवर्तनीय दायरे पर पढ़ने की जरूरत है। – user359996

उत्तर

28

HttpsURLConnectionHttpUrlConnection फैली हुई है, ताकि आप HttpsURLConnection की जरूरत नहीं है, तो आप सिर्फ

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
+1

ऐसी उम्र में समस्याएं निकलती हैं जब HTTPS अधिक से अधिक आवश्यक हो रहा है। –

+0

हां, यह जावा polymorphism का लाभ ले रहा है। इस तरह के conn का उपयोग करते समय JVM उपयुक्त वर्ग से विधि कॉल करेगा। तो जांचें जैसे कि (is_https) इस मामले में समझ में नहीं आता है। https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – kiedysktos

19

कर सकते हैं HttpsURLConnection extends HttpURLConnection जब से तुम HttpsURLConnection रूप conn घोषणा कर सकते हैं। इस तरह आप सामान्य इंटरफेस (setRequestMethod()) तक पहुंच सकते हैं।

विस्तार तरीकों का उपयोग करने के (जैसे getCipherSuite(), बच्चे वर्ग HttpsURLConnection में केवल परिभाषित) आप के बाद एक डाली का उपयोग करना चाहिए एक instanceof:

if (conn instanceof HttpsURLConnection) { 
    HttpsURLConnection secured = (HttpsURLConnection) conn; 
    String cipher = secured.getCipherSuite(); 
}