एक जावा सर्वलेट से दूसरे डेटा में पोस्ट डेटा लिखना

मैं एक सर्वलेट लिखने की कोशिश कर रहा हूं जो एक पोस्ट के माध्यम से एक एक्सएमएल फ़ाइल (एक्सएमएल स्वरूपित स्ट्रिंग) को अन्य सर्वलेट में भेज देगा। (गैर आवश्यक 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();

यह सर्वर त्रुटि उत्पन्न कर रहा है, और दूसरा सर्वलेट कभी नहीं बुलाया जाता है।

0

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 के पास बहुत ही विशिष्ट आरएफसी मानक हैं कि POST अनुरोध में शामिल डेटा को कैसे भेजा जाना चाहिए। यह केवल सामग्री का स्वरूपित नहीं है, बल्कि यह आउटपुटस्ट्रीम में "लिखित" के मैकेनिक भी है। समय के बहुत सारे पोस्ट अब भागों में लिखे गए हैं। यदि आप अपाचे के HTTP क्लाइंट के स्रोत कोड को देखते हैं तो आप देखेंगे कि यह भाग कैसे लिखता है।

परिणाम के रूप में सामग्री की लंबाई के साथ quirks हैं, क्योंकि सामग्री लंबाई लंबाई की पहचान एक छोटी संख्या और वर्णों के एक यादृच्छिक छोटे अनुक्रम द्वारा बढ़ाया जाता है जो धारा में लिखा गया है कि प्रत्येक खंड को सीमित करता है। HTTPURLConnection के नए जावा संस्करणों में वर्णित कुछ अन्य विधियों को देखें।

http: //java.sun .com/JavaSE/6/docs/api/जावा/शुद्ध/HttpURLConnection.html # setChunkedStreamingMode (int)

यदि आप नहीं जानते कि आप क्या कर रहे हैं और इसे नहीं सीखना चाहते हैं, तो अपाचे HTTP क्लाइंट जैसी निर्भरता जोड़ने से निपटने से वास्तव में बहुत आसान हो जाता है क्योंकि यह सभी जटिलताओं को सारणीबद्ध करता है और केवल काम करता है।

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
जोड़ा