Pergunta

Preciso de ajuda para descobrir como se apossar do redirecionamento depois de fazer uma postagem para o servidor. Primeiro, preciso obter alguns cookies do servidor. Em seguida, execute uma postagem com os cookies e parâmetros adicionais. O servidor responde com um redirecionamento de 302. Como faço para obter o URL para esse redirecionamento?

O código parece seguir:

HttpGet get = new HttpGet(urlOne);

try {
    //Creating a local instance of cookie store.
    CookieStore cookieJar = new BasicCookieStore();

    // Creating a local HTTP context
    HttpContext localContext = new BasicHttpContext();

    // Bind custom cookie store to the local context
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieJar);

    HttpResponse response = httpClient.execute(get, localContext);
    HttpEntity entity = response.getEntity();

    System.out.println("------------------GET----------------------");
    System.out.println(response.getStatusLine());
    if (entity != null) {
        System.out.println("Response content length: " + entity.getContentLength());
    }

    // Print out cookies obtained from server
    List<Cookie> cookies = cookieJar.getCookies();
    for (int i = 0; i < cookies.size(); i++) {
        System.out.println("Local cookie: " + cookies.get(i));
    }        

    if (entity != null) {
       entity.consumeContent();
    }
    System.out.println("------------------GET-END---------------------");

    // Create a new post
    HttpPost post = new HttpPost(urlTwo);
    post.setHeader("Content-Type", "application/x-www-form-urlencoded");

    // Add params
    HttpParams params = new BasicHttpParams();
    params.setParameter("action", "search");
    params.setParameter("word", "hello");

    post.setParams(params);

    //Execute
    HttpResponse response2 = httpClient.execute(post, localContext);
Foi útil?

Solução

Veja minha resposta para esta pergunta,

Httpclient 4 - Como capturar o último URL de redirecionamento

Outras dicas

Estou assumindo que você deseja automatizar operações do navegador e manter a sessão para que você possa acessar as páginas também que precisam ser mantidas.

Não sei como fazer isso através da API org.apache.http.client. Se você não estiver restrito ao uso da API org.apache.http.client e pode usar outra API, você pode usar Htmlunit API, caso contrário, você pode ignorar o restante da resposta.

Manter sessões e automatizar operações do navegador por meio de Htmlunit pode ser feito da seguinte maneira:

import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;

final WebClient webClient = new WebClient();
    try {
        webClient.setJavaScriptEnabled(true);
        webClient.setThrowExceptionOnScriptError(false);
        webClient.setCssEnabled(true);
        webClient.setUseInsecureSSL(true);
        webClient.setRedirectEnabled(true);

        HtmlPage loginPage = webClient.getPage(new URL("https://www.orkut.com/"));
        System.out.println(loginPage.getTitleText());
        List<HtmlForm> forms = loginPage.getForms();
        HtmlForm loginForm = forms.get(0);
        HtmlTextInput username = loginForm.getInputByName("Email");
        HtmlPasswordInput password = loginForm.getInputByName("Passwd");
        HtmlInput submit = loginForm.getInputByName("signIn");
        username.setValueAttribute("username");
        password.setValueAttribute("password");
        HtmlPage homePage = submit.click();.
        Thread.sleep(10 * 1000);
        HtmlPage homePageFrame = (HtmlPage) homePage.getFrameByName("orkutFrame").getEnclosedPage();
        HtmlPage communitiesTestPage = (HtmlPage) webClient.openWindow(new URL("http://www.orkut.co.in/Main#Community?cmm=1"), "CommunitiesWindow").getEnclosedPage();
    }catch(java.security.GeneralSecurityException e) {
        e.printStackTrace();
    }catch(java.io.IOException e) {
        e.printStackTrace();
    }catch(InterruptedException e) {
        e.printStackTrace();
    }

    WebWindow ww = webClient.getWebWindowByName("CommunitiesWindow");
    WebRequestSettings wrs1 = new WebRequestSettings(URL); // URL is the url that requires authentication first

Como você pode ver, como o código acima automatiza as operações do navegador e como ele mantém a sessão automaticamente. Não precisamos lidar com cookies ou urlredirirect manualmente ...

Existe uma maneira simples de que eu apareci em Java. A seguir, estão as etapas:

  1. Crie a conexão httpurl.
  2. Definir HttpURLConnection.setFollowRedirects( true ); // isso deve ser verdadeiro por padrão
  3. Ligue para conectar seu objeto HttpurlConnection;
  4. APÓS CONECT LIGUE O getHeadersFields() sobre o seu objeto httpurlConnection;
  5. Obtenha o URL redirecionado chamando o getUrl() sobre o objeto httpurlConnection acima;

Há também outra maneira de obtê -lo usando o campo de localização nos cabeçalhos HTTP, mas às vezes não obtemos o campo de localização nos cabeçalhos. Não funcionou pelo menos para mim. Mas o método acima, funciona com certeza.

Está disponível no location cabeçalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top