मैं HttpsURLConnection
का उपयोग कर एंड्रॉइड 4.0 से एक आरईएसटी वेब सेवा को लक्षित कर रहा हूं। यह ठीक काम करता है जब तक कि मैं POST
कुछ करने की कोशिश नहीं करता।एंड्रॉइड में HTTP कनेक्शन के लिए मैं स्पष्ट रूप से खंडित स्ट्रीमिंग मोड को कैसे अक्षम कर सकता हूं?
connection.setDoOutput(true);
connection.setChunkedStreamingMode(0);
ByteArrayOutputStream out = new ByteArrayOutputStream();
serializeObjectToStream(out, object);
byte[] array = out.toByteArray();
connection.getOutputStream().write(array, 0, array.length);
यह निम्नलिखित अपवाद फेंकता है:
java.net.HttpRetryException: Cannot retry streamed HTTP body
डिबगिंग मैंने महसूस किया कि उत्पादन धारा मैं connection.getOuputStream()
के माध्यम से प्राप्त प्रकार ChunkedOutputStream
की है से और Androids स्रोत कोड में खुदाई से यह प्रासंगिक कोड अनुभाग है मुझे लगा कि अगर किसी अनुरोध को पुनः प्रयास करने की आवश्यकता है (किसी भी कारण से), यह उपर्युक्त अपवाद के साथ पोक करता है, क्योंकि यह पता चलता है कि RetryableOutputStream
का उपयोग करके वह वहां चाहता है।
प्रश्न अब है: मैं अपने HttpsURL कनेक्शन को ऐसे रीट्रेबल आउटपुटस्ट्रीम को कैसे लौटा सकता हूं, या इसके बजाय, मैं ठीक से अनावृत अनुरोध एन्कोडिंग को कैसे रोक सकता हूं? मैं सोचा मैंने किया था कि पहले से ही साथ setChunkedStreamingMode(0)
, लेकिन जाहिरा तौर पर यह स्थिति नहीं है ...
[संपादित करें]
नहीं है, java.net.HTTPUrlConnection
के कार्यान्वयन 0 या उससे पहले के एक स्ट्रीमिंग मोड पर ध्यान नहीं देता:
public void setChunkedStreamingMode(int chunkLength) {
[...]
if (chunkLength <= 0) {
this.chunkLength = HttpEngine.DEFAULT_CHUNK_LENGTH;
} else {
this.chunkLength = chunkLength;
}
}
एक संबंधित नोट पर: मैं कारण लगता है _why_ यह बिल्कुल एक मूल प्रमाणीकरण सुरक्षा पर कॉन्फ़िगर क्योंकि वहाँ है एक RetryableOutputStream चाहता है आरईएसटी सर्वर और एंड्रॉइड के HttpURLConnectionImpl एक 401 अनधिकृत उत्तर प्राप्त होने पर स्वचालित रूप से एक अनुरोध पुनः प्रयास करने लगता है। –