2012-04-13 11 views
9

org.apache.http.impl.client.DefaultHttpClient का उपयोग कर OutputStream कैसे प्राप्त करें?मैं डिफ़ॉल्टHttpClient का उपयोग कर आउटपुटस्ट्रीम को कैसे लिखूं?

मैं आउटपुट स्ट्रीम में एक लंबी स्ट्रिंग लिखना चाहता हूं।

का उपयोग HttpURLConnection आप यह इतना तरह लागू करना होगा:

HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
OutputStream out = connection.getOutputStream(); 
Writer wout = new OutputStreamWriter(out); 
writeXml(wout); 

वहाँ एक विधि DefaultHttpClient क्या मैं ऊपर के समान का उपयोग कर है? HttpURLConnection के बजाय DefaultHttpClient का उपयोग करके मैं OutputStream पर कैसे लिखूं?

, उदा,

DefaultHttpClient client = new DefaultHttpClient(); 

OutputStream outstream = (get OutputStream somehow) 
Writer wout = new OutputStreamWriter(out); 
+0

@ किथरंडल, मैंने इसे संपादित किया है। उम्मीद है कि अब यह स्पष्ट है। – Fabii

+0

कृपया बताएं कि आप क्या लिखना चाहते हैं।आपके दोनों उदाहरणों में, getOutputStream() http POST अनुरोधों के लिए अनुरोध डेटा सबमिट करने के लिए प्रयुक्त एक स्ट्रीम देता है। –

+0

@EugeneKuleshov, मैं org.apache.http.impl.client.DefaultHttpClient का उपयोग कर आउटपुट स्ट्रीम कैसे प्राप्त करूं? – Fabii

उत्तर

13

आप BasicHttpClient से सीधे आउटपुटस्ट्रीम नहीं प्राप्त कर सकते हैं। आपको HttpUriRequest ऑब्जेक्ट बनाना है और इसे HttpEntity देना है जो उस सामग्री को समाहित करता है जिसे आप भेजना चाहते हैं। उदाहरण के लिए, यदि आपका उत्पादन काफी छोटा स्मृति में फिट करने के लिए है, आप निम्न कर सकता है:

// Produce the output 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
Writer writer = new OutputStreamWriter(out, "UTF-8"); 
writeXml(writer); 

// Create the request 
HttpPost request = new HttpPost(uri); 
request.setEntity(new ByteArrayEntity(out.toByteArray())); 

// Send the request 
DefaultHttpClient client = new DefaultHttpClient(); 
HttpResponse response = client.execute(request); 

डेटा इतना बड़ा है कि आप इसे स्ट्रीम करने के लिए की जरूरत है, तो यह अधिक मुश्किल हो जाता है, क्योंकि वहाँ कोई HttpEntity कार्यान्वयन कि आउटपुटस्ट्रीम स्वीकार करता है। यदि आप एक अस्थायी की जरूरत नहीं है - आप एक अस्थायी फ़ाइल पर लिखने और प्रयोग FileEntity या संभवतः एक पाइप की स्थापना की और नमूना कोड प्रदर्शित करता है कि सामग्री स्ट्रीम करने के लिए कैसे के लिए InputStreamEntity

संपादित Oleg के देखें जवाब उपयोग करने की आवश्यकता होगी सभी के बाद फ़ाइल या पाइप।

+0

धन्यवाद आदमी, बहुत सराहना की। – Fabii

+0

प्रश्न: यह लेखन xml (लेखक) क्या कर रहा है? इसके अलावा, आप request.setEntity() के लिए बाइट सरणी कैसे पारित कर रहे हैं? –

+0

@MattGrogan यह वास्तव में उस सामग्री का उत्पादन करने के लिए अनुप्रयोग तर्क को कार्यान्वित कर रहा है जो दूरस्थ सर्वर पर पोस्ट हो जाता है (प्रश्न में उदाहरण कोड से कॉपी किया गया है)। – Alex

-1

मत सोचो तुम HttpClient के साथ वहां कच्चे अनुरोध उत्पादन धारा मिल सकती है। लेकिन आप पैरामीटर मानों तक पहुंचने के लिए PostMethod.getParameters() का उपयोग कर सकते हैं। post method example भी देखें।

25

मुझे पता है कि एक और जवाब पहले ही स्वीकार कर लिया गया है, सिर्फ रिकॉर्ड के लिए यह है कि कोई व्यक्ति स्मृति में इंटरमीडिएट बफरिंग के बिना एचटीपी क्लाइंट के साथ सामग्री कैसे लिख सकता है।

AbstractHttpEntity entity = new AbstractHttpEntity() { 

     public boolean isRepeatable() { 
      return false; 
     } 

     public long getContentLength() { 
      return -1; 
     } 

     public boolean isStreaming() { 
      return false; 
     } 

     public InputStream getContent() throws IOException { 
      // Should be implemented as well but is irrelevant for this case 
      throw new UnsupportedOperationException(); 
     } 

     public void writeTo(final OutputStream outstream) throws IOException { 
      Writer writer = new OutputStreamWriter(outstream, "UTF-8"); 
      writeXml(writer); 
      writer.flush(); 
     } 

    }; 
    HttpPost request = new HttpPost(uri); 
    request.setEntity(entity); 
+0

नाइस - मुझे पता था कि सामग्री स्ट्रीम करने का एक आसान तरीका होना चाहिए था, बस इसके बारे में नहीं सोच सका। – Alex

+1

क्या इस प्रक्रिया का कोई अन्य उदाहरण है? कहां लिखने के लिए कहा जाता है? – HGPB

+1

@ हाराल्डो जब अनुरोध निष्पादित किया जाता है, तो HttpClient ढांचे 'request.getEntity() को कॉल करता है। लिखें() '। इसका मतलब यह है कि आप एक सिंगल थ्रेडेड क्लाइंट नहीं लिख सकते जो एक पोस्ट शुरू करता है, फिर आउटपुटस्ट्रीम को कई लिखने के लिए कॉलर को वापस देता है। – slim

2

यह एंड्रॉइड पर अच्छा काम करता है। इसे बड़ी फ़ाइलों के लिए भी काम करना चाहिए, क्योंकि कोई बफरिंग की आवश्यकता नहीं है।

PipedOutputStream out = new PipedOutputStream(); 
PipedInputStream in = new PipedInputStream(); 
out.connect(in); 
new Thread() { 
    @Override 
    public void run() { 
     //create your http request 
     InputStreamEntity entity = new InputStreamEntity(in, -1); 
     request.setEntity(entity); 
     client.execute(request,...); 
     //When this line is reached your data is actually written 
    } 
}.start(); 
//do whatever you like with your outputstream. 
out.write("Hallo".getBytes()); 
out.flush(); 
//close your streams 
+0

मेरे लिए पूरी तरह से काम करता है – mwag

1

मैं अपाचे के HTTP क्लाइंट API [PipedApacheClientOutputStream] जो HTTP POST के लिए एक OutputStream इंटरफ़ेस अपाचे कॉमन्स HTTP क्लाइंट 4.3.4 का उपयोग कर प्रदान करता है के एक उलट लिखा था।

कॉलिंग-कोड इस तरह दिखता है:

// Calling-code manages thread-pool 
ExecutorService es = Executors.newCachedThreadPool(
    new ThreadFactoryBuilder() 
    .setNameFormat("apache-client-executor-thread-%d") 
    .build()); 


// Build configuration 
PipedApacheClientOutputStreamConfig config = new  
    PipedApacheClientOutputStreamConfig(); 
config.setUrl("http://localhost:3000"); 
config.setPipeBufferSizeBytes(1024); 
config.setThreadPool(es); 
config.setHttpClient(HttpClientBuilder.create().build()); 

// Instantiate OutputStream 
PipedApacheClientOutputStream os = new  
PipedApacheClientOutputStream(config); 

// Write to OutputStream 
os.write(...); 

try { 
    os.close(); 
} catch (IOException e) { 
    logger.error(e.getLocalizedMessage(), e); 
} 

// Do stuff with HTTP response 
... 

// Close the HTTP response 
os.getResponse().close(); 

// Finally, shut down thread pool 
// This must occur after retrieving response (after is) if interested 
// in POST result 
es.shutdown(); 

नोट - अभ्यास एक ही ग्राहक, प्रबंधक सेवा में, और config संभावना आवेदन की जीवन भर पुन: उपयोग किया जाएगा, ताकि उपर्युक्त उदाहरण में बाहरी प्रीपे और क्लोज कोड संभावित रूप से आउटपुटस्ट्रीम तत्काल के साथ इनलाइन की बजाय बूटस्ट्रैप/इनिट और अंतिमकरण कोड में लाइव होगा।

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