Problem simulating HTTP POST using HttpClient

21,431

Solution 1

Visiting the link above and viewing the html source, it looks like the target path should be /en/s/planjourney/plan.

Solution 2

For everyone need an an answer to this post the solution is to use HttpContext to automatically manage cookies:

  HttpContext context=new BasicHttpContext();
  CookieStore cookiestore=new BasicCookieStore();
  context.setAttribute(ClientContext.COOKIE_STORE,cookiestore);

and pass it when you make an http request:

   HttpResponse response = client.execute(httpPost,context);

everytime you make a request your cookies store will automatically update! Easy!

Share:
21,431

Related videos on Youtube

Enrique
Author by

Enrique

Hi

Updated on January 28, 2020

Comments

  • Enrique
    Enrique about 4 years

    I am trying to programatically send a HTTP Post request using HttpClient to http://ojp.nationalrail.co.uk/en/s/planjourney/query but it is not liking the request I send it. I copied the headers and body from what Chrome browser sends so it is identical but it doesn't like what I send as the HTML mentions there's an error.

    <div class="padding">
                        <h1 class="sifr"><strong>Sorry</strong>, something went wrong</h1>
                        <div class="error-message">
                            <div class="error-message-padding">
                                <h2>There is a problem with the page you are trying to access.</h2>
                                <p>It is possible that it was either moved, it doesn't exist or we are experiencing some technical difficulties.</p>
                                <p>We are sorry for the inconvenience.</p>
                            </div> 
                        </div>
                    </div>
    

    Here is my Java program which uses HttpClient:

    package com.tixsnif;
    
    import org.apache.http.*;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.protocol.HTTP;
    
    import java.io.*;
    import java.util.*;
    import java.util.zip.GZIPInputStream;
    
    public class WebScrapingTesting {
    
    public static void main(String[] args) throws Exception {
        String target = "http://ojp.nationalrail.co.uk/en/s/planjourney/query";
    
        HttpClient client = new DefaultHttpClient();
    
        HttpPost httpPost = new HttpPost(target);
        BasicNameValuePair[] params = {
                new BasicNameValuePair("jpState", "single"),
                new BasicNameValuePair("commandName", "journeyPlannerCommand"),
                new BasicNameValuePair("from.searchTerm", "Basingstoke"),
                new BasicNameValuePair("to.searchTerm", "Reading"),
                new BasicNameValuePair("timeOfOutwardJourney.arrivalOrDeparture", "DEPART"),
                new BasicNameValuePair("timeOfOutwardJourney.monthDay", "Today"),
                new BasicNameValuePair("timeOfOutwardJourney.hour", "10"),
                new BasicNameValuePair("timeOfOutwardJourney.minute", "15"),
                new BasicNameValuePair("timeOfReturnJourney.arrivalOrDeparture", "DEPART"),
                new BasicNameValuePair("timeOfReturnJourney.monthDay", "Today"),
                new BasicNameValuePair("timeOfReturnJourney.hour", "18"),
                new BasicNameValuePair("timeOfReturnJourney.minute", "15"),
                new BasicNameValuePair("_includeOvertakenTrains", "on"),
                new BasicNameValuePair("viaMode", "VIA"),
                new BasicNameValuePair("via.searchTerm", "Station name / code"),
                new BasicNameValuePair("offSetOption", "0"),
                new BasicNameValuePair("_reduceTransfers", "on"),
                new BasicNameValuePair("operatorMode", "SHOW"),
                new BasicNameValuePair("operator.code", ""),
                new BasicNameValuePair("_lookForSleeper", "on"),
                new BasicNameValuePair("_directTrains", "on")};
    
        httpPost.setHeader("Host", "ojp.nationalrail.co.uk");
        httpPost.setHeader("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.231 Safari/534.10");
        httpPost.setHeader("Accept-Encoding", "gzip,deflate,sdch");
        httpPost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,**/*//*;q=0.8");
        httpPost.setHeader("Accept-Language", "en-us,en;q=0.8");
        httpPost.setHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        httpPost.setHeader("Origin", "http://www.nationalrail.co.uk/");
        httpPost.setHeader("Referer", "http://www.nationalrail.co.uk/");
        httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
        httpPost.setHeader("Cookie", "JSESSIONID=B2A3419B79C5D999CA4806B459675CCD.app201; Path=/");
        UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(Arrays.asList(params));
        urlEncodedFormEntity.setContentEncoding(HTTP.UTF_8);
        httpPost.setEntity(urlEncodedFormEntity);
        HttpResponse response = client.execute(httpPost);
    
        InputStream input = response.getEntity().getContent();
        GZIPInputStream gzip = new GZIPInputStream(input);
        InputStreamReader isr = new InputStreamReader(gzip);
        BufferedReader br = new BufferedReader(isr);
    
        String line = null;
        while((line = br.readLine()) != null) {
            System.out.printf("\n%s", line);
        }
    
        client.getConnectionManager().shutdown();
    }
    }
    

    I keep the JSESSION ID updated if it expires but there seems to be another problem that I cannot see. Am I missing something rather obvious?

    He

Related