2011-01-03 7 views
2

Ich versuche, eine HTTP-Post-Anfrage mit HttpClient zu http://ojp.nationalrail.co.uk/en/s/planjourney/query programmatisch zu senden, aber es ist nicht die Anfrage mag ich es senden. Ich habe die Header und den Text vom Chrome-Browser kopiert, sodass er identisch ist, aber das, was ich sende, mag es nicht, da der HTML-Code angibt, dass ein Fehler vorliegt.Problem simulieren HTTP-POST mit HttpClient

<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> 

Hier ist mein Java-Programm, das Httpclient verwendet:

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(); 
} 
} 

Ich halte die jsession ID aktualisiert, wenn es abgelaufen ist, aber es scheint ein anderes Problem, das ich nicht sehen kann. Fehle ich etwas offensichtlich?

Er

+0

Versuchen Sie, den Verkehr zu schnüffeln und die genaue Anfrage zu sehen, die Sie senden. Ich empfehle wirklich, Fiddler für HTTP-Sniffing zu verwenden. Siehe http://www.fiddler2.com/fiddler2/ – Tarlog

Antwort

0

Besuch auf den Link oben und Betrachten der HTML-Quellcode, es sieht aus wie der Zielpfad /en/s/planjourney/plan sein sollte.

0

Versuchen Sie, das HTTP-Client 4.1 verwenden und eine Umleitung Strategie auf dem HTTP-Client setzt Code für den Umgang mit 302-Status (Moved Temporarily)

2

Für alle brauchen eine Antwort auf dieses Thema liegt die Lösung ist Httpcontext zu verwenden, um automatisch zu verwalten Cookies:

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

und es passieren, wenn Sie eine hTTP-Anfrage machen:

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

jedes Mal wenn Sie eine Anfrage Ihre Cookies speichern machen wird automa Update! Einfach!