لا URL الجديد(...).openConnection() يعني بالضرورة المشاركة ؟

StackOverflow https://stackoverflow.com/questions/39391

  •  09-06-2019
  •  | 
  •  

سؤال

إن إنشاء HTTP java.net.URL ثم اتصل openConnection() على ذلك, لا يعني بالضرورة أن هذا HTTP post سيحدث ؟ وأنا أعلم أن openStream() يعني الحصول على.إذا كيف يمكنك تنفيذ أحد HTTP أخرى الأفعال دون الحاجة إلى العمل مع الخام طبقة مأخذ التوصيل?

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

المحلول

إذا كان يمكنك استرداد URLConnection كائن باستخدام openConnection() لا في الواقع بدء التواصل مع الملقم.هذا لا يحدث حتى تحصل على تيار من 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() على الرغم من.

نصائح أخرى

لا لا.ولكن إذا كان بروتوكول URL HTTP, سوف تحصل على HttpURLConnection بمثابة عودة وجوه.هذه الفئة لديها setRequestMethod طريقة لتحديد HTTP الطريقة التي تريد استخدامها.

إذا كنت تريد أن تفعل أكثر تطورا الاشياء ربما أنت أفضل حالا باستخدام مكتبة مثل جاكرتا HttpClient.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top