私はAndroidデバイス用のコードを書いてhttps
以上のWebサイトにログインし、結果のページからデータを解析します。 HttpGet
は、まずログインに必要な情報を取得してから、実際のログインプロセスを行うためにHttpPost
を取得します。HttpPostはAndroidプロジェクトではなくJavaプロジェクトで動作します
次のコードは、ビルド・パスに次のJARファイルを持ってEclipse内のJavaプロジェクトで素晴らしい作品: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。上記のJarファイルを使って実行すると、302リダイレクトが得られますが、ビルドパス上の1.6 Android JarファイルでAndroidプロジェクトから全く同じコードを実行すると、サーバーから200応答が得られます。 2.2デバイスでコードを実行すると、同じ200応答が返ってきます。
私のAndroidアプリケーションにはインターネットアクセス権があり、HttpGetは正常に動作します。私は問題がHttpPost(または他のいくつかのクラス)がAndroid Jarバージョンとより新しいApacheバージョンの間でいくつかの重要な方法で異なっているという事実にあると仮定しています。
私はAndroidプロジェクトのビルドパスにApacheライブラリを追加しようとしましたが、重複したクラスのためにログにINFO/dalvikvm(390): DexOpt: not resolving ambiguous class 'Lorg/apache/http/impl/client/DefaultHttpClient;'
というメッセージが表示されます。私もUrlEncodedFormEntity
の代わりにMultipartEntity
を使ってみましたが、私は同じ200の結果を得ます。
私はいくつかの質問があります:
- アンドロイドで実行されているコードで、Androidのバージョンより新しいApacheライブラリを使用するよう強制できますか?
- そうでない場合は、Android Jarで動作するようにコードを変更する方法はありますか?
- AndroidでHttpPostを実行するための方法はまったく異なりますか?
- その他のアイデアですか?
私はreadalotofpostsとcodeをしましたが、私はどこにも届きません。私は数日間これに固執していたし、私は仕事をする方法を失っているので、私はこの時点で何かを試してみます。前もって感謝します。
良い答えです。 Gingerbreadでは、後でHttpURLConnectionを使用する方法があります。推奨されないApache HttpClientを検討してください。 –