1

私のアプリは HTTP POSTS を実行します。通常、アプリは動作しますが、Cookie に問題があります。私のコードは HttpClient 変数を介して Cookie を正常に取得しているように見えますが、POST の結果は、私のアプリ (クライアントとして) が何も記憶していないことを示しています。(PCでWebブラウザを使用すると、問題なく動作します.Cookieは私の名前を覚えています)また、アプリを再起動すると、Cookieは消えます(...しかし、最初のこと)

これは私のコードです:

static DefaultHttpClient httpclient;
static HttpPost httppost;
static CookieStore cookiestore;

new Thread(new Runnable() {
        public void run() {

            String URI_FOR_DOMAIN="http://chatbot.t.com/cgi-bin/elbot.cgi";

            httppost = new HttpPost(URI_FOR_DOMAIN);
            try {
                HttpResponse resp = httpclient.execute(httppost);
            } catch (IOException e) {
                e.printStackTrace();
            }

            cookiestore = ((DefaultHttpClient) httpclient).getCookieStore();
            List<Cookie> list = cookiestore.getCookies();
            app.logy("COOKIE STORE 1: " + cookiestore.toString());
            app.logy("COOKIE LIST  1: "+list.toString());
            for (int i=0;i<list.size();i++) {
                Cookie cookie = list.get(i);
                app.logy("COOKIE "+i+": "+cookie.toString());
            }

            HttpContext context = new BasicHttpContext();
            context.setAttribute(  ClientContext.COOKIE_STORE, cookiestore);

            httppost = new HttpPost(url);
            try {
                // Add your data
                List<NameValuePair> nameValuePairs = new ArrayList<>(2);
                nameValuePairs.add(new BasicNameValuePair("ENTRY", userInput));
                nameValuePairs.add(new BasicNameValuePair("IDENT", userIDENT));
                nameValuePairs.add(new BasicNameValuePair("USERLOGID", userLOGID));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                // Execute HTTP Post Request
                app.logy("COOKIE STORE 2: "+cookiestore.toString());
                app.logy("COOKIE CONTEXT: " + context.toString());
                HttpResponse response = httpclient.execute(httppost, context);

                cookiestore = ((DefaultHttpClient) httpclient).getCookieStore();
                List<Cookie> list2 = cookiestore.getCookies();
                app.logy("COOKIE STORE 2: " + cookiestore.toString());
                app.logy("COOKIE LIST  2: "+list2.toString());
                for (int i=0;i<list2.size();i++) {
                    Cookie cookie = list2.get(i);
                    app.logy("COOKIE2 i="+i+": "+cookie.toString());
                }

                HttpEntity entity = response.getEntity();
}


                    }
                    app.logy(sb.toString());
                }
                catch (IOException e) { e.printStackTrace(); }
                catch (Exception e) { e.printStackTrace(); }


            } catch (ClientProtocolException e) {
                app.logy("HttpPOST (ClientProtocol) error: "+e);
            } catch (IOException e) {
                app.logy("HttpPOST (I/O) error: "+e);
            }

        }
    }).start();

これは、上記のコードから Logcats に反映される値です。Cookie はあるようですが、HttpResponse response = httpclient.execute(httppost, context); です。それらを無視しているようです。

COOKIE STORE 2: [[version: 0][name: cookie_user_name][value: Albert][domain: elbot-e.artificial-solutions.com][path: /][expiry: Thu Oct 08 22:26:54 GMT+02:00 2015]]
COOKIE LIST  2: [[version: 0][name: cookie_user_name][value: Albert][domain: elbot-e.artificial-solutions.com][path: /][expiry: Thu Oct 08 22:26:54 GMT+02:00 2015]]
COOKIE2 i=0: [version: 0][name: cookie_user_name][value: Albert][domain: elbot-e.artificial-solutions.com][path: /][expiry: Thu Oct 08 22:26:54 GMT+02:00 2015]
4

1 に答える 1

1

まず、あらゆる種類の API 呼び出しに AsyncTask を使用する必要があります。個別のスレッドの作成は機能しますが、悪い習慣であり、Android の方法ではありません。次に、API 呼び出しで HTTPPost の代わりに HttpUrlConnection を使用します。これは、API インタラクションを行う新しい方法です。これらの両方を試して、Cookie の問題がどうなるかを確認してください。

@ Joshによる編集:@ cj1090が彼の推奨事項で正しい方向に私を送ったことが判明したので、彼の回答を編集して実装を追加し、それを緑としてマークします。彼が勧めたように、私は戦略を変更し、Thread+HTTPpost ソリューションの代わりに HttpURLConnection に基づく AsyncTask を実装しました。コードは完全に機能し、Cookie は HttpURLConnection オブジェクトによって内部的に処理されます。ただし、アプリが破棄されると Cookie は消えますが、それはまた別の機会に。コードをお楽しみください!BASE_URL はヴィンテージの HTML Web サイトの URL であり、ユーザーは params[0] に文字列を送信することで通信します。

  //Call the AsyncTask like this:
final String BASE_URL = "http://elba.artisol.com/cgi/bot.cgi";
String fromUserTextbox="hello"
new elbotHttpTask().execute(url);


   public class elbotHttpTask extends AsyncTask<String, Void, Integer> {

        @Override
        protected Integer doInBackground(String... params) {
            InputStream inputStream = null;
            HttpURLConnection urlConnection = null;
            Integer result = 0;
            try {
                URL obj = new URL(BASE_URL);
                HttpURLConnection con = (HttpURLConnection) obj.openConnection();
                con.setRequestMethod("POST");
                con.setDoInput(true);
                con.setDoOutput(true);
                //con.setRequestProperty("User-Agent", USER_AGENT);

                app.userInput=params[0];

                List<NameValuePair> parameters = new ArrayList<NameValuePair>();
                parameters.add(new BasicNameValuePair("ENTRY", params[0]));
                parameters.add(new BasicNameValuePair("IDENT", app.sessionIDENT));
                parameters.add(new BasicNameValuePair("USERLOGID", app.sessionUSERLOGID));


                // For POST only - START
                app.logy("pp.getQuery(parameters): "+app.getQuery(parameters));
                OutputStream os = con.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(app.getQuery(parameters));
                writer.flush();
                writer.close();
                os.close();

                con.connect();

                int responseCode = con.getResponseCode();
                System.out.println("POST Response Code :: " + responseCode);

                if (responseCode == HttpURLConnection.HTTP_OK) { //success
                    BufferedReader in = new BufferedReader(new InputStreamReader(
                            con.getInputStream()));
                    String inputLine;
                    StringBuffer response = new StringBuffer();

                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }
                    in.close();
                    consumeHTMLresponse(response.toString());
                    result = 1;
                } else {
                    System.out.println("POST request not worked");
                    result = 0;
                }
            } catch (Exception e) {
                app.logy(e.getLocalizedMessage());
            }
            return result; //"Failed to fetch data!";
        }



        @Override
        protected void onPostExecute(Integer result) {
            if(result == 1){
                app.logy("onPostEXECUTE SUCCESS");
            }else{
                app.logy("Failed to fetch data!");
            }
        }
    }
于 2015-08-19T21:16:59.750 に答える