Domanda

Ho bisogno di aiuto con capire come entrare in possesso del reindirizzamento dopo aver fatto un post al server. In primo luogo, ho bisogno di fare un get per ottenere alcuni biscotti dal server. Poi mi esibisco un post con i biscotti e parametri aggiuntivi. Il server risponde poi con un reindirizzamento 302. Come faccio a ottenere l'URL di reindirizzamento che?

Codice appare come segue:

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);
È stato utile?

Soluzione

Altri suggerimenti

Io parto dal presupposto che si desidera automatizzare le operazioni del browser e mantenere la sessione in modo da poter accedere a quelle pagine troppo che devono sessione di essere mantenuto.

Non so come questo attraverso API org.apache.http.client. Se non siete costretti ad usare API org.apache.http.client e possibile utilizzare altre API è possibile utilizzare HtmlUnit API altrimenti si può ignorare il resto della risposta.

Il mantenimento di sessioni e le operazioni del browser l'automazione attraverso HtmlUnit può essere fatto nel seguente modo:

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

Come si può vedere che come i sopra codice del browser operazioni automatizzare e come si mantiene la sessione automaticamente. Non abbiamo bisogno di gestire i cookie o URLReDirect manualmente ...

C'è un modo semplice mi è venuto su in Java. Di seguito sono riportati i passi:

  1. Creare la connessione HTTPUrl.
  2. Imposta HttpURLConnection.setFollowRedirects( true ); // questo dovrebbe essere vero per default
  3. Call Connect sopra il vostro oggetto HttpURLConnection;
  4. Dopo il collegamento chiamare il getHeadersFields() sopra il vostro oggetto HttpURLConnection;
  5. Ottenere l'URL reindirizzato chiamando il getUrl() sull'oggetto HttpURLConnection sopra;

C'è anche un altro modo di ottenerlo utilizzando il campo Location in Intestazioni HTTP, ma a volte non si ottiene il campo località nelle intestazioni. Non ha funzionato per me almeno. Ma il metodo di cui sopra, funziona di sicuro.

E 'disponibile nel location intestazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top