Проблема с сессией HttpClient Post? Как узнать, создана ли сессия?

Это дополнительный вопрос https://stackoverflow.com/questions/3550593/sending-html-commands-over-httpclient-android, у меня есть успешно отправил сообщение на сервер и получил код 200, но когда я пытаюсь перейти на другую страницу, он не распознает, что я вошел в систему. Мне интересно, является ли это проблемой сеанса или мне нужно следовать перенаправлению после POST. Как мне поступить после перенаправления? Опять же, любая помощь приветствуется. Вот простое приложение HttpClient/POST, которое я создал из примеров, чтобы помочь мне быстро протестировать любые изменения.

public class HttpClientTest extends Activity{

HttpClient client = new DefaultHttpClient();

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

    final Button btnFetch = (Button)findViewById(R.id.button);
    final TextView txtResult = (TextView)findViewById(R.id.content);
    final Button login = (Button)findViewById(R.id.button2);


    btnFetch.setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v){
            getRequest(txtResult);
        }
    });

    login.setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v){
            try {
                login(txtResult);
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}

public void getRequest(TextView txtResult){
    HttpGet request = new HttpGet("http://gc.gamestotal.com/i.cfm?f=com_empire&cm=3");
    try{
        HttpResponse response = client.execute(request);
        txtResult.setText(Parser.request(response));
    }catch(Exception ex){
        txtResult.setText("Failed!");
    }
}

public void login(TextView txtResult) throws UnsupportedEncodingException, IOException{
    String action = "i.cfm?&1028&p=login&se=4";
    String yourServer = "http://gc.gamestotal.com/";
    HttpPost post = new HttpPost(yourServer + action);
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("nic", "user"));
    params.add(new BasicNameValuePair("password", "password"));
    params.add(new BasicNameValuePair("server", "4"));
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
    post.setEntity(entity);

    try{
        HttpResponse response = client.execute(post);
        txtResult.setText(response.getEntity().toString());
    }catch(Exception ex){
        txtResult.setText("Failed!");
    }
}

}

Сначала я нажимаю кнопку входа в пользовательский интерфейс, который дает мне код ответа Http/1.1 200 OK, но когда я нажимаю кнопку btnFetch, которая отправляет меня на страницу, на которой вы должны войти в систему, чтобы получить доступ, я получаю не вошел в систему страница. Любые идеи?


person Alejandro Huerta    schedule 25.08.2010    source источник
comment
Вы должны задать этот вопрос тому, кто написал веб-приложение, к которому вы обращаетесь. Только они могут сказать вам, как они хотят, чтобы вы делали то, что пытаетесь сделать.   -  person CommonsWare    schedule 25.08.2010
comment
Я боялся таких. Спасибо за ответ.   -  person Alejandro Huerta    schedule 25.08.2010
comment
Могут быть проблемы с файлами cookie. Пожалуйста, проверьте   -  person Vinay    schedule 25.08.2010
comment
Я пытаюсь выяснить файл cookie, я начинаю думать, что это может быть проблема Referer. Я также попытаюсь отредактировать заголовки, чтобы они точно имитировали Firefox.   -  person Alejandro Huerta    schedule 25.08.2010


Ответы (2)


Я знаю, немного поздно, но я также наткнулся на эту публикацию, и мне нужна ссылка на этот ответ здесь: Управление сеансом Android, в котором говорится, что вы должны повторно использовать свой HttpClient, который обрабатывает управление сеансом, т.е. сделайте HttpClient статическим и создайте его экземпляр только один раз. Но я не знаю, является ли это всей правдой для ваших требований. Для меня это было.

Ваше здоровье!

person Christian Lischnig    schedule 02.03.2012

После долгих исследований и множества примеров позже мне наконец удалось войти на сайт, который я пытался. По-видимому, это была проблема, связанная с тем, что я не использовал объект из ответа, то есть файлы cookie. Я создал простую операцию, основной целью которой является ПОЛУЧЕНИЕ и ОТПРАВКА на сайт, а затем вывод результата в LogCat. Возможно, это может помочь другим.

public class HttpClientTest extends Activity{

DefaultHttpClient client = new DefaultHttpClient();
HttpGet request;
HttpEntity entity;
List<Cookie> cookies;
HttpResponse response;
HttpPost post;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        getRequest();
    } catch (Exception e) {
        Log.d("My Activity", "Failed");
        e.printStackTrace();
    }
}

public void getRequest() throws Exception
{
    final String TAG = "MyActivity";
    request = new HttpGet("http://some.site.com/");
    response = client.execute(request);
    entity = response.getEntity();
    Log.d(TAG, "Login form get: " + response.getStatusLine());
    if(entity != null)
    {
        entity.consumeContent();
    }
    Log.d(TAG, "Initial set of cookies:");

    cookies = client.getCookieStore().getCookies();
    if (cookies.isEmpty())
    {
        Log.d(TAG, "None");
    }
    else
    {
        for(int i = 0; i<cookies.size(); i++)
        {
            Log.d(TAG, "- " + cookies.get(i));
        }
    }
    String action = "i.cfm?&1028&p=login&se=4";
    String yourServer = "http://some.site.com/";
    post = new HttpPost(yourServer + action);

    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("nic", "username"));
    params.add(new BasicNameValuePair("password", "password"));
    params.add(new BasicNameValuePair("server", "4"));

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


    response = client.execute(post);
    entity = response.getEntity();

    Log.d(TAG, "Login form get: " + response.getStatusLine());
    if(entity != null){
        entity.consumeContent();
    }

    Log.d(TAG, "Post logon cookies:");
    cookies = client.getCookieStore().getCookies();
    if (cookies.isEmpty())
    {
        Log.d(TAG, "None");
    } 
    else
    {
        for (int i = 0; i < cookies.size(); i++) 
        {
            Log.d(TAG, "- " + cookies.get(i));
        }
    }


    request = new HttpGet("http://some.site.com/i.cfm?f=com_empire&cm=3");

    response = client.execute(request);
    Log.d(TAG, "Check for login: " + Parser.request(response));
    if(entity != null)
    {
        entity.consumeContent();
    }

}

}

последний лог, Log.d(TAG, "Проверить логин: " + Parser.request(ответ)); распечатывает html сайта, проходя через класс парсера, который я использовал для проверки того, что это действительно страница, требующая успешного входа в систему

person Alejandro Huerta    schedule 26.08.2010