2008-09-02 9 views
10

यदि मैं HTTP java.net.URL बना देता हूं और फिर openConnection() पर कॉल करता हूं, तो क्या यह आवश्यक रूप से इंगित करता है कि एक HTTP पोस्ट होने जा रहा है? मुझे पता है कि openStream() एक जीईटी का तात्पर्य है। यदि हां, तो आप कच्चे सॉकेट परत के साथ काम किए बिना किसी अन्य HTTP क्रियाओं में से एक कैसे करते हैं?क्या नया यूआरएल (...)। OpenConnection() जरूरी है कि एक पोस्ट का मतलब है?

उत्तर

16

यदि आप openConnection() का उपयोग कर URLConnection ऑब्जेक्ट पुनर्प्राप्त करते हैं तो यह वास्तव में सर्वर से संचार शुरू नहीं करता है। ऐसा तब तक नहीं होता जब तक आपको URLConnection() से स्ट्रीम प्राप्त न हो जाए। जब आप पहली बार कनेक्शन प्राप्त करते हैं तो आप इसे खोलने से पहले हेडर और अन्य कनेक्शन गुण जोड़/बदल सकते हैं।

URLConnection का जीवन चक्र थोड़ा अजीब है। जब तक आप स्ट्रीम में से एक प्राप्त नहीं कर लेते हैं, तब तक यह हेडर को सर्वर पर नहीं भेजता है। अगर आपको इनपुट स्ट्रीम मिलती है तो मुझे लगता है कि यह एक प्राप्त करता है, हेडर भेजता है, फिर आपको आउटपुट पढ़ने देता है। अगर आपको आउटपुट स्ट्रीम मिलती है तो मुझे लगता है कि यह इसे एक पोस्ट के रूप में भेजता है, क्योंकि ऐसा लगता है कि आप इसे डेटा लिखेंगे (आउटपुट स्ट्रीम के लिए आपको setDoOutput(true) पर कॉल करने की आवश्यकता हो सकती है)। जैसे ही आप इनपुट स्ट्रीम प्राप्त करते हैं, आउटपुट स्ट्रीम बंद होती है और यह सर्वर से प्रतिक्रिया के लिए प्रतीक्षा करती है।

उदाहरण के लिए, यह एक पोस्ट करना चाहिए:

URL myURL = new URL("http://example.com/my/path"); 
URLConnection conn = myURL.openConnection(); 
conn.setDoOutput(true); 
conn.setDoInput(true); 

OutputStream os = conn.getOutputStream(); 
os.write("Hi there!"); 
os.close(); 

InputStream is = conn.getInputStream(); 
// read stuff here 

यह एक मिलता है जबकि:

URL myURL = new URL("http://example.com/my/path"); 
URLConnection conn = myURL.openConnection(); 
conn.setDoOutput(false); 
conn.setDoInput(true); 

InputStream is = conn.getInputStream(); 
// read stuff here 

URLConnection भी अन्य अजीब बातें करते होंगे। यदि सर्वर सामग्री की लंबाई निर्दिष्ट करता है तो URLConnection अंतर्निहित इनपुट स्ट्रीम तब तक खुला रहेगा जब तक कि वह उस डेटा को प्राप्त न करे, भले ही आप इसे स्पष्ट रूप से बंद कर दें। इसने हमारे लिए बहुत सी समस्याएं पैदा की क्योंकि इसने हमारे क्लाइंट को थोड़ा मुश्किल से बंद कर दिया, क्योंकि URLConnection नेटवर्क कनेक्शन खुला रखेगा। यह शायद संभवतया मौजूद है भले ही आप getStream() का उपयोग करें।

3

नहीं, ऐसा नहीं है। लेकिन यदि यूआरएल का प्रोटोकॉल HTTP है, तो आपको रिटर्न ऑब्जेक्ट के रूप में HttpURLConnection मिल जाएगा। इस वर्ग में setRequestMethod विधि निर्दिष्ट करने के लिए है कि आप किस HTTP विधि का उपयोग करना चाहते हैं।

यदि आप अधिक परिष्कृत सामग्री करना चाहते हैं तो आप Jakarta HttpClient जैसी लाइब्रेरी का उपयोग करके शायद बेहतर हो सकते हैं।

संबंधित मुद्दे