1

Мое приложение выполняет HTTP POSTS, в общем приложение работает, но у меня возникают проблемы с файлами cookie. Мой код, похоже, отлично передает файлы cookie через переменную HttpClient и out, но результаты POST показывают, что мое приложение (как клиент) ничего не помнит. (Когда я использую webbroswer в своем компьютере, он отлично работает, куки помнят мое имя) Кроме того, если приложение перезагружается, файлы cookie исчезают (... но сначала что-то в первую очередь)Android игнорирует файлы cookie в моем HTTP-сообщении

Это мой код:

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 из приведенного выше кода. Печеньки, кажется, есть, но 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] 

ответ

1

Прежде всего, вы должны использовать AsyncTask для любых вызовов api. Создание отдельных потоков работает, но это плохая практика, а не андроид. Во-вторых, в вашем вызове api используйте HttpUrlConnection вместо HTTPPost. Это новый способ взаимодействия с апи. Попробуйте обе эти вещи и посмотрите, что происходит с вашей проблемой cookie.

EDIT by @Josh: Получается, что @ cj1090 отправил меня в правильном направлении с его рекомендацией, поэтому я отредактирую его ответ, чтобы добавить реализацию и отметить ее как зеленый. Как он рекомендовал, я изменил стратегию и внедрил AsyncTask на основе HttpURLConnection вместо решения Thread + HTTPpost. Код работает отлично, и куки-файлы обрабатываются внутри объекта HttpURLConnection. Однако файлы cookie исчезают, если приложение уничтожено, но это тема для другого дня. Наслаждайтесь кодом! Base_url является марочным HTML 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!"); 
      } 
     } 
    } 
+0

В моем нынешнем подходе я разворачивать response.getEntity() и извлечь весь HTML строку из веба-страницы URL. Могу ли я сделать то же самое с предложенным вами методом HrrpUrlConnection? – Josh

+0

Я не понимаю, почему нет. Существует ответ get() из httpUrlConnection, поэтому я уверен, что это тот же объект ответа, который вы используете. – cj1098

+0

Спасибо, я попробую и вернусь – Josh

Смежные вопросы