2012-08-22 15 views
11

मैं 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; 
    } 
} 
+0

एक संबंधित नोट पर: मैं कारण लगता है _why_ यह बिल्कुल एक मूल प्रमाणीकरण सुरक्षा पर कॉन्फ़िगर क्योंकि वहाँ है एक RetryableOutputStream चाहता है आरईएसटी सर्वर और एंड्रॉइड के HttpURLConnectionImpl एक 401 अनधिकृत उत्तर प्राप्त होने पर स्वचालित रूप से एक अनुरोध पुनः प्रयास करने लगता है। –

उत्तर

12

बमर! समाधान क्लाइंट कोड से setChunkedStreamingMode() (या यहां तक ​​कि setFixedStreamingMode()) पर कॉल नहीं करना है! "-1" फिक्स्ड लम्बाई और चंकड लम्बाई के लिए आंतरिक डिफ़ॉल्ट मान हैं और क्लाइंट-साइड सेट नहीं किए जा सकते हैं, क्योंकि "0" के मान को कम या बराबर सेट करने से यह HttpEngine.DEFAULT_CHUNK_LENGTH (या निश्चित स्ट्रीमिंग मोड केस में अपवाद फेंकता है) को डिफ़ॉल्ट कर देता है।

2

समाधान Content-Length शीर्षलेख सेट करना है (जिसे इस अगले भाग द्वारा सेट किया जा सकता है) और setFixedLengthStreamingMode पर पोस्ट संदेश की उचित लंबाई के साथ कॉल करें जिसे आप भेजना चाहते हैं।

इस अतः पूछे जाने वाले प्रश्न में "स्ट्रीमिंग मोड" अनुभाग देखें:

Using java.net.URLConnection to fire and handle HTTP requests

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^