को भेजने की शक्ति मुझे एक अस्पष्ट वेबसर्वर से बात करने की आवश्यकता है जिसके लिए प्रमाणीकरण की आवश्यकता है। अगर मैं प्रमाण-पत्र नहीं देता हूं, तो लॉगिन फॉर्म प्रदर्शित होता है। हालांकि, अगर मैं अनचाहे मूल प्रमाणीकरण प्रमाण-पत्रों की आपूर्ति करता हूं, तो मैं सीधे वांछित सामग्री पर जाता हूं।अपाचे HTTP घटक के साथ HTTP प्रमाणीकरण: चुनौती
wget
इस सीधे समर्थन करता है:
# this fails and downloads a form:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh
# this works and downloads the document:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh --auth-no-challenge
अब मेरे सवाल: मैं कैसे जावा में डाउनलोड अपाचे के HTTP अवयव का उपयोग कर बना सकते हैं?
यहां तक कि मुझे अब तक क्या मिला है। (इसके अलावा कई जगह में एक प्रॉक्सी है, और मैं wget
में -Y on
उपयोग करते हैं, और मैं एक मिलान https_proxy
वातावरण चर की है।)
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import java.net.URI;
// ...
DefaultHttpClient hc = new DefaultHttpClient();
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxy_name, proxy_port));
URI uri = new URI("https://weird.egg/data.txt");
hc..getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials("me", "shh"));
hc.execute(new HttpGet(uri)); // etc
हालांकि, मैं केवल लॉगिन प्रपत्र पेज, न कि वास्तविक दस्तावेज़ के साथ खत्म। मुझे संदेह है कि DefaultHttpClient wget
करता है, जिस तरह से अनचाहे प्रमाण पत्र नहीं भेज रहा है। क्या जावा प्रोग्राम को प्रमाण पत्र भेजने का कोई तरीका है?
महान विचार, धन्यवाद। ढांचा समाधान भी मेरे लिए काम नहीं करता था। मैन्युअल रूप से हेडर जोड़ना काम किया। –
धन्यवाद। मुझे मेवेन HTTP वैगन क्लाइंट के साथ एक ही समस्या थी और मैन्युअल रूप से हेडर जोड़कर इसे हल करें। –
आजकल आप 'java.util.Base64.getEncoder()। EncodeToString (कुछ)' का उपयोग कर सकते हैं, 'import org.apache.commons.codec.binary.Base64 पर निर्भर रहने की आवश्यकता नहीं है;' – eis