0

AndroidからWebサイトにテキストを入力しようとしていますが、httppostが適切なオプションであると読みました。HttpClient 4.2.2(GA)tar.gzをダウンロードして解凍し、7つのjarファイルをEclipseのAndroidプロジェクトのlibフォルダーにコピーしました。ウェブサイトにリストされているものと一致しているので、私はすべての瓶を手に入れたと確信しています。

次に、http: //hc.apache.org/httpcomponents-client-ga/quickstart.htmlからトップチュートリアルをコピーして貼り付けました。

すべてをインポートしたところ、次のエラーが発生しました。

   EntityUtils.consume(entity1);  //X
    } finally {
       httpGet.releaseConnection();  //X

コードのこの部分はチュートリアルの2つの場所にあり、両方でエラーが発生します。Eclipseは最初の行について次のように述べています。

「メソッドconsume(HttpEntity)は、タイプEntityUtilsに対して未定義です。」

二行目:

「メソッドreleaseConnection()は、タイプHttpGetに対して未定義です。」

私はすべてのjarファイルをダウンロードし、正しく転送し、すべてをインポートしたと確信しています。エラーの原因は何ですか?ありがとう。

これが私が今持っているものです。エドワード、私はあなたのメソッドからのコードのいくつかを使用しましたが、それらをonCreateに入れました。ただし、これは機能していません。前のアクティビティから今回のアクティビティに移動してから数秒後に、アプリが「予期せず停止しました」というメッセージが表示されます。

Webサイトのテキストフィールドに文字列を入力することについて質問があります。HttpParamsのNameValuePairsを使用しますか?これが私のコードです、何が悪いのかわかりますか?ありがとう。

    package com.example.myapp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;

public class BalanceCheckerActivity extends Activity {

private final String LOGIN_URL = "https://someloginsite.com"; //username and password

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_balance_checker);

        String username = getIntent().getExtras().getString("username");
        String password = getIntent().getExtras().getString("password");

        //Building post parameters, key and value pair
        List<NameValuePair> accountInfo = new ArrayList<NameValuePair>(2);
        accountInfo.add(new BasicNameValuePair("inputEnterpriseId", username));
        accountInfo.add(new BasicNameValuePair("password", password));

        //Creating HTTP client
        HttpClient httpClient = new DefaultHttpClient();

        //Creating HTTP Post
        HttpPost httpPost = new HttpPost(LOGIN_URL);

        BasicHttpParams params = new BasicHttpParams();
        params.setParameter("inputEnterpriseID", username);
        params.setParameter("password", password);
        httpPost.setParams(params);

        //Url Encoding the POST parameters
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(accountInfo));
        }
        catch (UnsupportedEncodingException e) {
            // writing error to Log
            e.printStackTrace();
            startActivity(new Intent(this, AccountInputActivity.class));
        }

        HttpResponse response = null;
        InputStreamReader iSR = null;
        String source = null;

     // Making HTTP Request
        try {
            response = httpClient.execute(httpPost);

            // writing response to log
            Log.d("Http Response:", response.toString());

            iSR = new InputStreamReader(response.getEntity().getContent());

            BufferedReader br = new BufferedReader(iSR);   
            source = "";

            while((source = br.readLine()) != null)
            {
                source += br.readLine();
            }

        } catch (ClientProtocolException e) {
            // writing exception to log
            e.printStackTrace();
            startActivity(new Intent(this, AccountInputActivity.class));

        } catch (IOException e) {
            // writing exception to log
            e.printStackTrace();
            startActivity(new Intent(this, AccountInputActivity.class));
        }
        System.out.println(source);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_balance_checker, menu);
        return true;
    }
    }
4

1 に答える 1

2

それはほとんど私にはかなりよく見えます。私はその中に明らかに間違ったコードを1つだけ見ました:

while((source = br.readLine()) != null)
{
    source += br.readLine();
}

それは一種の混乱であり、それを解きほぐすのではなく、ただ書き直します。

StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null)
  sb.append(line);
String source = sb.toString();

また、onCreate()から、またはUIスレッド内からでもネットワークI / Oを実行しないでください。これは、長時間ブロックされ、UI全体がフリーズし、「アプリケーションが応答しない」(ANR)クラッシュを引き起こす可能性があるためです。 。しかし、簡単なテストプログラムの場合は、今のところそのスライドを許可できます。本番コードの場合は、スレッドを起動するか、AsyncTask()を使用します。

とにかく、私たちはあなたのためにあなたのプログラムを構築してデバッグすることに本当に興味がありません。このコードを試しましたか?結果はどうでしたか?

最後に、このようなログインシーケンスでは、Cookieの形式で認証トークンが返される可能性があります。HttpResponseからCookieを抽出する方法を忘れましたが、それを実行してから、受信したCookieをそのWebサイトへの後続の要求の一部として含める必要があります。


元の答え:

私はあなたが自分自身をすべて絡ませていると思います。Apache httpクライアントパッケージはAndroidに組み込まれているため、apacheからjarファイルをダウンロードする必要はありません。

私はEntityUtilsに精通していませんが、それが何であれ、使用を避けることができれば、そうします。可能な限り、バンドルされたAPIを使用するようにしてください。アプリケーションに追加するすべてのサードパーティまたはユーティリティライブラリは肥大化を促進します。モバイルデバイスでは、アプリケーションを可能な限り軽量に保つ必要があります。実際の" consume()"メソッドが見つからないということに関しては、それはおそらくドキュメントの間違いです。彼らはおそらくを意味しconsumeContent()ました。

このreleaseConnection()呼び出しは、おそらく持続的接続にのみ必要です。これは比較的高度な使用法です。自分のコードで永続的な接続や管理された接続すらしていません。

あなたはあなたが何をしようとしているのかを私たちに知らせるのに十分な情報を提供していませんが、私はあなたに合理的に一般的な答えを与えるようにします。

httpプロトコルを介してサーバーにデータを送信する方法は多数ありますが、ほとんどの場合、フォームにエンコードされたデータをHttpPostを介して送信する必要があります。

手順は次のとおりです。

  • 作成するDefaultHttpClient
  • HttpPostリクエスト を作成する
    • setHeader()必要に応じて、またはでヘッダーを追加しますaddHeader()
    • 送信するデータを次の形式で追加します。HttpEntity
  • client.execute()ポストリクエストで電話する
  • 待って受け取りますHttpResponse; ステータスコードを調べます。
  • サーバーからのデータの返送を期待している場合は、response.getEntity()

HttpEntityデータを収集し、それぞれ独自の方法でサーバーに送信するクラスはたくさんあります。フォームでエンコードされたデータを送信していると仮定すると、それUrlEncodedFormEntityが必要なデータになります。このエンティティは、NameValuePairフォームにエンコードされたデータ用に適切にフォーマットされたオブジェクトのリストを取得して送信します。

これを行うために私が書いたコードは次のとおりです。これらは単なるコードフラグメントであるため、アプリケーションに組み込んで自分でデバッグするのはあなたに任せます。

/**
 * POST the given url, providing the given list of NameValuePairs
 * @param url   destination url
 * @param data  data, as a list of name/value pairs
 */
public HttpResponse post(String url, List<NameValuePair> data) {
    HttpPost req = new HttpPost(url);
    UrlEncodedFormEntity e;
    try {
        e = new UrlEncodedFormEntity(data, "UTF-8");
    } catch (UnsupportedEncodingException e1) {
        Log.e(TAG, "Unknown exception: " + e1);
        return null;   // Or throw an exception, it's up to you
    }
    return post(req, e);
}

/**
 * Post an arbitrary entity.
 * @param req   HttpPost
 * @param data  Any HttpEntity subclass
 * @return HttpResponse from server
 */
public HttpResponse post(HttpPost req, HttpEntity data) {
    try {
        HttpClient client = new DefaultHttpClient();
        req.setEntity(data);
        HttpResponse resp = client.execute(req);
        int status = resp.getStatusLine().getStatusCode();
        if (status != HttpStatus.SC_OK) {
            Log.w(TAG,
              "http error: " + resp.getStatusLine().getReasonPhrase());
            return null;   // Or throw an exception, it's up to you
        }
        return resp;
    } catch (ClientProtocolException e) {
        Log.e(TAG, "Protocol exception: " + e);
        return null;
    } catch (UnknownHostException e) {
        return null;
    } catch (IOException e) {
        Log.e(TAG, "IO exception: " + e);
        return null;
    } catch (Exception e) {
        // Catch-all
        Log.e(TAG, "Unknown exception: " + e);
        return null;
    }
}
于 2012-12-04T02:37:42.050 に答える