كتابة بيانات البريد من java servlet إلى آخر

أحاول كتابة servlet لإرسال ملف xml (سلسلة منسقة xml) إلى servlet آخر عبر POST. (استبدال كود xml الأساسي غير الضروري بـ "Hello there")

   StringBuilder sb=  new StringBuilder();
    sb.append("Hello there");

    URL url = new URL("theservlet's URL");
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();                
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Length", "" + sb.length());

    OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream());
    outputWriter.write(sb.toString());
    outputWriter.flush();
    outputWriter.close();

يتسبب هذا في حدوث خطأ في الخادم ، ولن يتم استدعاء servlet الثاني أبدًا.

0
وأضاف
الآراء: 1

4 إجابة

هذا النوع من الأشياء أسهل كثيرًا باستخدام مكتبة مثل HttpClient . هناك أيضًا نشر مثال رمز xml :

PostMethod post = new PostMethod(url);
RequestEntity entity = new FileRequestEntity(inputFile, "text/xml; charset=ISO-8859-1");
post.setRequestEntity(entity);
HttpClient httpclient = new HttpClient();
int result = httpclient.executeMethod(post);
0
وأضاف

لا يبدو أن محتويات دفق تحميل نشر HTTP وآلياته هي ما تتوقعه. لا يمكنك فقط كتابة ملف كمحتوى النشر ، لأن POST له معايير RFC محددة جدًا حول كيفية إرسال البيانات المضمنة في طلب POST. لا يقتصر الأمر على تنسيق المحتوى نفسه ، ولكنه أيضًا الميكانيكي لكيفية "كتابة" المحتوى. الكثير من الوقت هو مكتوب الآن POST في قطع. إذا نظرت إلى شفرة المصدر لـ HTTPClient في Apache سترى كيف يكتب القطع.

هناك انحرافات مع طول المحتوى كنتيجة ، لأنه يتم زيادة طول المحتوى من خلال عدد صغير يحدد القطعة وتسلسل صغير عشوائي من الأحرف التي تحدد كل جزء كما هو مكتوب عبر الدفق. انظر إلى بعض الطرق الأخرى الموضحة في إصدارات Java أحدث من HTTPURLConnection.

http: //java.sun كوم/javase/6/مستندات/المعهد/جافا/صافي/HttpURLConnection.html # setChunkedStreamingMode (الباحث)

إذا كنت لا تعرف ما تقوم به ولا تريد أن تتعلمه ، فإن التعامل مع إضافة تبعية مثل Apache HTTPClient يصبح في الواقع أسهل بكثير لأنه يلخص كل التعقيدات ويعمل فقط.

0
وأضاف

لا تنس أن تستخدم:

connection.setDoOutput( true)

إذا كنت تنوي إرسال الإخراج.

0
وأضاف

أوصي باستخدام Apache HTTPClient بدلاً من ذلك ، لأنه واجهة برمجة تطبيقات أفضل.

ولكن لحل هذه المشكلة الحالية: حاول الاتصال connection.setDoOutput (true)؛ بعد فتح الاتصال.

StringBuilder sb=  new StringBuilder();
sb.append("Hello there");

URL url = new URL("theservlet's URL");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();                
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Length", "" + sb.length());

OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream());
outputWriter.write(sb.toString());
outputWriter.flush();
outputWriter.close();
0
وأضاف