4

Web サイトにログインする必要があるアプリを作成しています。そのために、HttpClient を作成し、URL に対して HttpPost を実行します。これは私が知る限り機能しています。StatusCodes は 200 を返します。この後、(同じクライアントで) 制限された URL に対して HttpGet を実行します。ただし、常に禁止された例外またはログイン画面が LogCat に返されます。Web での検索から、HttpPost の前に最初にサイトに HttpGet を実行し、CookieStore を添付する必要がある場合があることがわかりました。両方を実行しましたが、まだ成功していません..これで私を助けることができる誰かがここにいますか?

        HttpClient client = new DefaultHttpClient();

        HttpGet initiate = new HttpGet(url);            
        HttpPost post = new HttpPost(url);
        HttpGet page = new HttpGet(restrictedurl);
        HttpContext localContext = new BasicHttpContext();

        CookieStore cookieStore = new BasicCookieStore();
        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

            try {
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("username", username));
                params.add(new BasicNameValuePair("password", password));

                post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

                HttpResponse response = client.execute(initiate, localContext);
                Log.i(Tag, " " + response.getStatusLine().getStatusCode());
                response.getEntity().consumeContent();

                response = client.execute(post, localContext);
                Log.i(Tag, " " + response.getStatusLine().getStatusCode());             
                response.getEntity().consumeContent();                                      

                ResponseHandler<String> handler = new BasicResponseHandler();
                String htmlpage = client.execute(page, handler, localContext);
                Log.i(Tag, " " + response.getStatusLine().getStatusCode());
                Log.i(Tag, htmlpage);
                response.getEntity().consumeContent();  

            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

これが私のLogCatです:

    06-06 13:38:47.033: I/LogTag    (27839):  StatusCode HttpGet: 200
    06-06 13:38:47.197: I/LogTag    (27839):  StatusCode HttpPost: 200
    06-06 13:38:47.361: W/System.err(27839): org.apache.http.client.HttpResponseException: Forbidden
    06-06 13:38:47.377: W/System.err(27839):    at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71)
    06-06 13:38:47.384: W/System.err(27839):    at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59)
    06-06 13:38:47.384: W/System.err(27839):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657)
    06-06 13:38:47.384: W/System.err(27839):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627)
    06-06 13:38:47.384: W/System.err(27839):    at com.dakro.wiebetaaltwat.MainActivity$AsyncPost.doInBackground(MainActivity.java:136)
    06-06 13:38:47.384: W/System.err(27839):    at com.dakro.wiebetaaltwat.MainActivity$AsyncPost.doInBackground(MainActivity.java:1)
    06-06 13:38:47.392: W/System.err(27839):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
    06-06 13:38:47.392: W/System.err(27839):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    06-06 13:38:47.392: W/System.err(27839):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    06-06 13:38:47.392: W/System.err(27839):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
    06-06 13:38:47.392: W/System.err(27839):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    06-06 13:38:47.400: W/System.err(27839):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    06-06 13:38:47.400: W/System.err(27839):    at java.lang.Thread.run(Thread.java:856)
4

3 に答える 3

1

甘い成功!URL に POST して 200 StatusCode を返すことはできましたが、それは「完全な」URL ではありませんでした。index.php を追加する必要がありました。また、フォームデータが完全ではありませんでした。さらに 2 つのパラメーターを追加する必要がありました。

                params.add(new BasicNameValuePair("action", "login"));
                params.add(new BasicNameValuePair("login_submit", "Inloggen"));

これは、サイトに投稿されたフォーム データについてサイトを調べることでわかりました。Chromeの開発者ツール(ネットワークタブ)でビルドを使用しました。回答ありがとうございます。

于 2012-06-06T23:15:02.270 に答える
1

この条件を使用できます

 StatusLine statusLine = response.getStatusLine();
                int statusCode = statusLine.getStatusCode();
                if (statusCode == 200) {

                } else {

                }
于 2012-06-06T12:10:05.617 に答える
1

禁止されたエラーは、通常、Web サーバーでアクセスしているディレクトリ/ファイルのアクセス許可の問題を示しています。

所有者とグループの権限を確認してください。ファイルの書き込み/読み取り/実行フラグも確認してください。

Web ブラウザを介して URL に直接移動し、禁止されたメッセージも表示されているかどうかを確認できますか?

于 2012-06-06T12:07:10.140 に答える