How auto redirect in HttpClient (java, apache)
Solution 1
Due to design limitations HttpClient 3.x is unable to automatically handle redirects of entity enclosing requests such as POST and PUT. You either have to manually convert POST request to a GET upon redirect or upgrade to HttpClient 4.x, which can handle all types of redirects automatically.
Solution 2
In case of the 3.x version of HttpClient, you can also check if the response code is 301 or 302 and then use the Location header to re-post:
client.executeMethod(post);
int status = post.getStatusCode();
if (status == 301 || status == 302) {
String location = post.getResponseHeader("Location").toString();
URI uri = new URI(location, false);
post.setURI(uri);
client.executeMethod(post);
}
Mediator
I'm owner kitesurfing schools, lessons and equipment website.
Updated on June 18, 2022Comments
-
Mediator almost 2 years
I create httpClient and set settings
HttpClient client = new HttpClient(); client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); client.getParams().setContentCharset("UTF-8");
First request (get)
GetMethod first = new GetMethod("http://vk.com"); int returnCode = client.executeMethod(first); BufferedReader br = null; String lineResult = ""; if (returnCode == HttpStatus.SC_NOT_IMPLEMENTED) { System.err.println("The Post method is not implemented by this URI"); // still consume the response body first.getResponseBodyAsString(); } else { br = new BufferedReader(new InputStreamReader(first.getResponseBodyAsStream(), Charset.forName("windows-1251"))); String readLine = ""; while (((readLine = br.readLine()) != null)) { lineResult += readLine; } }
Response correct.
Second request (post):
PostMethod second = new PostMethod("http://login.vk.com/?act=login"); second.setRequestHeader("Referer", "http://vk.com/"); second.addParameter("act", "login"); second.addParameter("al_frame", "1"); second.addParameter("captcha_key", ""); second.addParameter("captcha_sid", ""); second.addParameter("expire", ""); second.addParameter("q", "1"); second.addParameter("from_host", "vk.com"); second.addParameter("email", email); second.addParameter("pass", password); returnCode = client.executeMethod(second); br = null; lineResult = ""; if (returnCode == HttpStatus.SC_NOT_IMPLEMENTED) { System.err.println("The Post method is not implemented by this URI"); // still consume the response body second.getResponseBodyAsString(); } else { br = new BufferedReader(new InputStreamReader(second.getResponseBodyAsStream())); String readLine = ""; while (((readLine = br.readLine()) != null)) { lineResult += readLine; } }
this response is correct too, but I need to be redirected to Headers.Location.
I do not know how to get value from Headers Location or how to automatically enable redirection.
-
Mediator almost 13 yearsError - "Entity enclosing requests cannot be redirected without user intervention"
-
Dilini over 2 yearsYou might have to use
post.getResponseHeader("Location").getValue();