में मैंने अपने एंड्रॉइड डिवाइस के लिए https
पर किसी वेबसाइट पर लॉगिन करने के लिए कुछ कोड लिखा है और परिणामी पृष्ठों से कुछ डेटा पार्स किया है। लॉगिन के लिए कुछ जानकारी प्राप्त करने के लिए पहले HttpGet
वास्तविक लॉगिन प्रक्रिया करने के लिए HttpPost
प्राप्त होता है। httpcore-4.1-beta2.jar
, httpclient-4.1-alpha2.jar
, httpmime-4.1-alpha2.jar
, commons-logging-1.1.1.jar
:एचटीपीपोस्ट जावा प्रोजेक्ट में काम करता है, एंड्रॉइड
कोड नीचे ग्रहण के भीतर एक जावा परियोजना जो निर्माण के रास्ते पर निम्नलिखित जार फ़ाइलों है में महान काम करता है।
public static MyBean gatherData(String username, String password) {
MyBean myBean = new MyBean();
try {
HttpResponse response = doHttpGet(URL_PAGE_LOGIN, null, null);
System.out.println("Got login page");
String content = EntityUtils.toString(response.getEntity());
String token = ContentParser.getToken(content);
String cookie = getCookie(response);
System.out.println("Performing login");
System.out.println("token = "+token +" || cookie = "+cookie);
response = doLoginPost(username,password,cookie, token);
int respCode = response.getStatusLine().getStatusCode();
if (respCode != 302) {
System.out.println("ERROR: not a 302 redirect!: code is \""+ respCode+"\"");
if (respCode == 200) {
System.out.println(getHeaders(response));
System.out.println(EntityUtils.toString(response.getEntity()).substring(0, 500));
}
} else {
System.out.println("Logged in OK, loading account home");
// redirect handler and rest of parse removed
}
}catch (Exception e) {
System.out.println("ERROR in gatherdata: "+e.toString());
e.printStackTrace();
}
return myBean;
}
private static HttpResponse doHttpGet(String url, String cookie, String referrer) {
try {
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
client.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
HttpGet httpGet = new HttpGet(url);
httpGet.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
httpGet.setHeader(HEADER_USER_AGENT,HEADER_USER_AGENT_VALUE);
if (referrer != null && !referrer.equals("")) httpGet.setHeader(HEADER_REFERER,referrer);
if (cookie != null && !cookie.equals("")) httpGet.setHeader(HEADER_COOKIE,cookie);
return client.execute(httpGet);
} catch (Exception e) {
e.printStackTrace();
throw new ConnectException("Failed to read content from response");
}
}
private static HttpResponse doLoginPost(String username, String password, String cookie, String token) throws ClientProtocolException, IOException {
try {
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
client.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
HttpPost post = new HttpPost(URL_LOGIN_SUBMIT);
post.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
post.setHeader(HEADER_USER_AGENT,HEADER_USER_AGENT_VALUE);
post.setHeader(HEADER_REFERER, URL_PAGE_LOGIN);
post.setHeader(HEADER_COOKIE, cookie);
post.setHeader("Content-Type","application/x-www-form-urlencoded");
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
formParams.add(new BasicNameValuePair("org.apache.struts.taglib.html.TOKEN", token));
formParams.add(new BasicNameValuePair("showLogin", "true"));
formParams.add(new BasicNameValuePair("upgrade", ""));
formParams.add(new BasicNameValuePair("username", username));
formParams.add(new BasicNameValuePair("password", password));
formParams.add(new BasicNameValuePair("submit", "Secure+Log+in"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams,HTTP.UTF_8);
post.setEntity(entity);
return client.execute(post);
} catch (Exception e) {
e.printStackTrace();
throw new ConnectException("ERROR in doLoginPost(): "+e.getMessage());
}
}
सर्वर (जो मेरे नियंत्रण में नहीं है) एक 302 रीडायरेक्ट लौटाता है जब लॉगिन सफल रहा था, और 200 अगर यह विफल रहता है और फिर से लोड प्रवेश पृष्ठ। उपरोक्त जार फ़ाइलों के साथ चलाते समय मुझे 302 रीडायरेक्ट मिलता है, हालांकि अगर मैं एंड्रॉइड प्रोजेक्ट से सटीक कोड चलाता हूं तो बिल्ड पथ पर 1.6 एंड्रॉइड जार फ़ाइल के साथ मुझे सर्वर से 200 प्रतिक्रिया मिलती है। मेरे 2.2 डिवाइस पर कोड चलाते समय मुझे 200 प्रतिक्रिया मिलती है।
मेरे एंड्रॉइड एप्लिकेशन में इंटरनेट अनुमतियां हैं, और एचटीपीजीट ठीक काम करता है। मुझे लगता है कि समस्या इस तथ्य में निहित है कि एंड्रॉइड जार संस्करण और नए अपाचे संस्करणों के बीच कुछ महत्वपूर्ण तरीके से एचटीपीपोस्ट (या कुछ अन्य वर्ग) अलग है।
मैंने एंड्रॉइड प्रोजेक्ट के निर्माण पथ में अपाचे लाइब्रेरी जोड़ने का प्रयास किया है, लेकिन डुप्लिकेट कक्षाओं के कारण मुझे लॉग में INFO/dalvikvm(390): DexOpt: not resolving ambiguous class 'Lorg/apache/http/impl/client/DefaultHttpClient;'
संदेश मिलते हैं। मैंने UrlEncodedFormEntity
के बजाय MultipartEntity
का उपयोग करने का भी प्रयास किया है, लेकिन मुझे 200 परिणाम मिलते हैं।
तो, मैं कुछ प्रश्न हैं:
- मैं Android संस्करण वरीयता में नए अपाचे पुस्तकालयों का उपयोग करने के लिए कोड एंड्रॉयड के तहत चल मजबूर कर सकते हैं?
- यदि नहीं, तो क्या किसी के पास कोई विचार है कि मैं अपना कोड कैसे बदल सकता हूं ताकि यह एंड्रॉइड जार के साथ काम कर सके?
- एंड्रॉइड में एचटीपीपोस्ट करने के लिए कोई अन्य, पूरी तरह से अलग दृष्टिकोण हैं?
- कोई अन्य विचार?
मैं readalotofposts और code है लेकिन मैं कहीं भी नहीं मिल रहा है। मैं इस पर कुछ दिनों तक फंस गया हूं और मुझे नुकसान हुआ है कि काम को कैसे काम करना है, इसलिए मैं इस बिंदु पर कुछ भी कोशिश करूंगा। अग्रिम में धन्यवाद।
अच्छा जवाब। जिंजरब्रेड में और बाद में, HttpURLConnection जाने का रास्ता है। Apache HttpClient बहिष्कृत पर विचार करें। –