java 新手的 httpclient 重定向

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7546849/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 20:25:48  来源:igfitidea点击:

httpclient redirect for newbies

javahttpclient

提问by Brian

Possible Duplicate:
Httpclient 4, error 302. How to redirect?

可能重复:
Httpclient 4,错误 302。如何重定向?

I want to retrieve some information from my comcast account. Using examples on this site, I think I got pretty close. I am using firebug to see what to post, and I see that when I login I am being redirected. I don't understand how to follow the redirects. I have played with countless examples but just can't figure it out. I am new to programming and just not having any luck doing this. Here is my code. I make an initial login, then go to try to go to another URL which is where the redirects begin. Along the way, I see that I am acquiring lots of cookies, but not the important one s_lst.

我想从我的 comcast 帐户中检索一些信息。使用本网站上的示例,我想我已经很接近了。我正在使用 firebug 来查看要发布的内容,并且在我登录时看到我被重定向。我不明白如何遵循重定向。我玩过无数的例子,但就是想不通。我是编程新手,只是没有运气这样做。这是我的代码。我进行了初始登录,然后尝试转到重定向开始的另一个 URL。一路上,我看到我获得了很多 cookie,但不是重要的 s_lst。

HttpPost httpPost = new HttpPost("https://login.comcast.net/login");

        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("continue", "https://login.comcast.net/account"));
        nvps.add(new BasicNameValuePair("deviceAuthn", "false"));
        nvps.add(new BasicNameValuePair("forceAuthn", "true"));
        nvps.add(new BasicNameValuePair("ipAddrAuthn", "false"));
        nvps.add(new BasicNameValuePair("lang", "en"));
        nvps.add(new BasicNameValuePair("passwd", "mypassword"));
        nvps.add(new BasicNameValuePair("r", "comcast.net"));
        nvps.add(new BasicNameValuePair("rm", "2"));
        nvps.add(new BasicNameValuePair("s", "ccentral-cima"));
        nvps.add(new BasicNameValuePair("user", "me"));

        httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

        System.out.println("executing request " + httpPost.getURI());
        // Create a response handler
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        String responseBody = httpclient.execute(httpPost, responseHandler);
        String cima = StringUtils.substringBetween(responseBody, "cima.ticket\" value=\"", "\">");
        System.out.println(cima);

        HttpPost httpPost2 = new HttpPost("https://customer.comcast.com/Secure/Home.aspx");

        List <NameValuePair> nvps2 = new ArrayList <NameValuePair>();
        nvps2.add(new BasicNameValuePair("cima.ticket", cima));

        httpPost2.setEntity(new UrlEncodedFormEntity(nvps2, HTTP.UTF_8));

        System.out.println("executing request " + httpPost2.getURI());
        // Create a response handler
        ResponseHandler<String> responseHandler2 = new BasicResponseHandler();
        String responseBody2 = httpclient.execute(httpPost2, responseHandler2);
        System.out.println(responseBody2);

回答by Martin Dow

Here's a sample adapted from the 'Response Handling' example here.

下面是一个示例改编自“响应处理的榜样这里

Your example is quite complicated - best to simplify your code while you figure out how to follow redirects (you can comment out the section I've highlighted to show the example failing to follow the redirect).

您的示例非常复杂 - 最好在弄清楚如何跟踪重定向的同时简化您的代码(您可以注释掉我突出显示的部分以显示未能遵循重定向的示例)。

import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.protocol.*;

public class ClientWithResponseHandler {

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

        DefaultHttpClient httpclient = new DefaultHttpClient();
        // Comment out from here (Using /* and */)...
        httpclient.setRedirectStrategy(new DefaultRedirectStrategy() {                
          public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context)  {
            boolean isRedirect=false;
            try {
              isRedirect = super.isRedirected(request, response, context);
            } catch (ProtocolException e) {
              e.printStackTrace();
            }
            if (!isRedirect) {
              int responseCode = response.getStatusLine().getStatusCode();
              if (responseCode == 301 || responseCode == 302) {
                return true;
              }
            }
            return false;
          }
        });
        // ...to here and the request will fail with "HttpResponseException: Moved Permanently"
        try {
            HttpPost httpPost = new HttpPost("http://news.bbc.co.uk/");
            System.out.println("executing request " + httpPost.getURI());
            // Create a response handler
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httpPost, responseHandler);
            System.out.println(responseBody);
            // Add your code here...
        } finally {
            // When HttpClient instance is no longer needed, shut down the connection 
            // manager to ensure immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        }
    }

}