javahttprequesthttp-status-code-303

How can a java program automatically follow redirection in 303 http status code response


I tried to access this url in my java program but I got this strange message instead of the page content as I was expecting.

How can I avoid this?

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
 <head> 
  <title>303 See Other</title> 
 </head>
 <body> 
  <h1>See Other</h1> 
  <p>The answer to your request is located <a href="https://www.wikidata.org/wiki/Special:EntityData/P26">here</a>.</p>  
 </body>
</html>

In a browser though I can navigate there easily. Is there some function or library I can use to evoke that functionality from my java program?

for (String url : list_of_relation_URLs) 
{
    //System.out.println( url );

    //go to relation url
    String URL_czech = url;

    System.out.println( url  );

    URL wikidata_page = new URL(URL_czech);
    HttpURLConnection wiki_connection = (HttpURLConnection)wikidata_page.openConnection();
    InputStream wikiInputStream = null;

    try 
    {
        // try to connect and use the input stream
        wiki_connection.connect();
        wikiInputStream = wiki_connection.getInputStream();
    } 
    catch(IOException error) 
    {
        // failed, try using the error stream
        wikiInputStream = wiki_connection.getErrorStream();
    }

    // parse the input stream using Jsoup
    Document docx = Jsoup.parse(wikiInputStream, null, wikidata_page.getProtocol()+"://"+wikidata_page.getHost()+"/");

    System.out.println( docx.toString() );  
}

I'm trying to do basically the opposite of what is going on here.


Solution

  • When you receive a 303 status code, you simply need to make a second request to the URL supplied with the 303.

    The new URL is stored in the Location header.

    In your case, you will need to keep following until you get a different status code as you will be redirected two times.

    303: Location:"https://www.wikidata.org/wiki/Special:EntityData/P26"

    303: Location:"https://www.wikidata.org/wiki/Property:P26"

    And yes... if you are using a HttpURLConnection you can ask it to do this for you.

    conn.setInstanceFollowRedirects(true);