Entrare in possesso di reindirizzamento URL con Java org.apache.http.client
-
19-09-2019 - |
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);
Soluzione
Vedere la mia risposta a questa domanda,
HttpClient 4 - come catturare ultimo URL di reindirizzamento
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:
- Creare la connessione HTTPUrl.
- Imposta
HttpURLConnection.setFollowRedirects( true );
// questo dovrebbe essere vero per default - Call Connect sopra il vostro oggetto HttpURLConnection;
- Dopo il collegamento chiamare il
getHeadersFields()
sopra il vostro oggetto HttpURLConnection; - 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.