سؤال

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

   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 الثاني مطلقًا.

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

المحلول

هذا النوع من الأشياء أسهل بكثير باستخدام مكتبة مثل 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);

نصائح أخرى

أوصي باستخدام أباتشي 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();

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

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

http://java.sun.com/javase/6/docs/api/Java/net/HttpURLConnection.html#setChunkedStreamingMode(int)

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

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

connection.setDoOutput( true)

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

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