HttpClient HTTP / 1.1 302 Объект перемещен - PullRequest
0 голосов
/ 17 ноября 2011

Этот код работает для моей простой формы входа в систему тестирования.Он использует POST для входа в систему, а затем распечатывает всю информацию на экране из зарегистрированного просмотра.Но это не работает на одном конкретном веб-сайте, я создавал этот код полностью.Есть идеи, почему это происходит и как это исправить?

package visualutopiabot;

import org.apache.http.client.ResponseHandler;
import org.apache.http.impl.client.BasicResponseHandler;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

    public class Main {

        public static void main(String[] args) throws Exception {

            DefaultHttpClient httpclient = new DefaultHttpClient();
            try {

                /* POST login */
                HttpPost httpost = new HttpPost("http://website.com/login.asp");

                List <NameValuePair> nvps = new ArrayList <NameValuePair>();
                nvps.add(new BasicNameValuePair("username", "nnnnick"));
                nvps.add(new BasicNameValuePair("password", "pppassswww123"));

                httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
                HttpResponse response = httpclient.execute(httpost);
                HttpEntity entity = response.getEntity();
                System.out.println("Login form get: " + response.getStatusLine());
                EntityUtils.consume(entity);

                /* get content*/
                HttpGet httpget = new HttpGet("http://website.com/index.asp");

                System.out.println("executing request " + httpget.getURI());

                // Create a response handler
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                String responseBody = httpclient.execute(httpget, responseHandler);
                System.out.println("----------------------------------------");
                System.out.println(responseBody);
                System.out.println("----------------------------------------");


            } finally {
                // When HttpClient instance is no longer needed,
                // shut down the connection manager to ensure
                // immediate deallocation of all system resources
                httpclient.getConnectionManager().shutdown();
            }
        }
    }

Ответы [ 4 ]

2 голосов
/ 17 ноября 2011

Если вы используете httpclient 3x

GetMethod имеет для флага followRedirects значение true по умолчанию

Вы можете попробовать установить set redirect на true явно для PostMethod

 PostMethod postMethod = ...;
 postMethod.setFollowRedirects(true)

Если вы используете httpcomponents

httpclient.setRedirectStrategy(new DefaultRedirectStrategy());
httpost.getParams().setParameter("http.protocol.handle-redirects",true);

Подробнее см. http://hc.apache.org/httpcomponents-client-ga/tutorial/html/httpagent.html#d4e1192

0 голосов
/ 24 ноября 2011

Ответом было то, что я отправлял неправильные запросы POST.Вместо:

nvps.add(new BasicNameValuePair("username", "nnnnick"));
nvps.add(new BasicNameValuePair("password", "pppassswww123"));

Пришлось написать:

nvps.add(new BasicNameValuePair("login", "nnnnick"));
nvps.add(new BasicNameValuePair("pw", "pppassswww123"));
0 голосов
/ 17 ноября 2011

HTTP-код 302 - это один из способов сделать перенаправление. Ваш код, вероятно, правильно выполняет вход в систему, а затем сервер перенаправляет его на другую страницу. В любом случае, вы должны увидеть заголовок Location: в ответе и следовать ему.

0 голосов
/ 17 ноября 2011

302 означает, что страница переместилась.Вам нужно проверить заголовок Location в ответе и повторить запрос на URL в этом заголовке.

...