2017-02-20 82 views
0

我試圖從網站獲取數據:http://www.wecare4air.co.uk/air-quality-data/brookgate-cb-1/ 我使用Charles來獲取Firefox發送到站點以獲取數據的發佈請求和標頭,使用Apache庫的相同的東西(相同的文章,相同的頭文件)。Java - Apache Post請求不返回完整頁面

但是,我的Java代碼只能得到結果網站的樣板文件 - 即它得到的網站沒有結果。響應的狀態代碼是2000,但是,它的大小是8kB,而不是由Firefox加載的站點20kB。

任何想法可能會造成這種情況?

下面是代碼(塊狀原因在於需要在設置參數的數量):

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
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.HttpClients; 
import org.apache.http.message.BasicNameValuePair; 

import java.io.*; 
import java.util.ArrayList; 
import java.util.List; 

final static String WEBSITE_URL = "http://www.wecare4air.co.uk/non- aurn-results"; 

private static String dateToStationRoadPostRequestFormat(String date) { 
    return String.format("%s/%s/%s", date.substring(8, 10), date.substring(5, 7), date.substring(0, 4)); 
} 

private static String timeToStationRoadPostRequestFormat(String time) { 
    return time.substring(0,5); 
} 

/** 
*@param date is of format YYYY-MM-DD 
*@param time is of format HH:00:00 
*/ 
private static List<NameValuePair> preparePostRequestParams (String date, String time) { 
    date = dateToStationRoadPostRequestFormat(date); 
    time = timeToStationRoadPostRequestFormat(time); 

    List<NameValuePair> params = new ArrayList<NameValuePair>(2); 
    params.add(new BasicNameValuePair("station-id", "221")); 
    params.add(new BasicNameValuePair("station_name", "Brookgate CB1")); 
    params.add(new BasicNameValuePair("output_type", "grid")); 
    params.add(new BasicNameValuePair("report_length", "daily")); 
    params.add(new BasicNameValuePair("checkboxes", "all")); 
    params.add(new BasicNameValuePair("monitors[]", "5")); 
    params.add(new BasicNameValuePair("monitors[]", "4")); 
    params.add(new BasicNameValuePair("monitors[]", "6")); 
    params.add(new BasicNameValuePair("monitors[]", "119")); 
    params.add(new BasicNameValuePair("monitors[]", "48")); 
    params.add(new BasicNameValuePair("monitors[]", "11")); 
    params.add(new BasicNameValuePair("monitors[]", "13")); 
    params.add(new BasicNameValuePair("monitors[]", "12")); 
    params.add(new BasicNameValuePair("monitors[]", "161")); 
    params.add(new BasicNameValuePair("monitors[]", "162")); 
    params.add(new BasicNameValuePair("monitors[]", "10")); 
    params.add(new BasicNameValuePair("monitors[]", "48")); 
    params.add(new BasicNameValuePair("monitors[]", "11")); 
    params.add(new BasicNameValuePair("monitors[]", "13")); 
    params.add(new BasicNameValuePair("monitors[]", "161")); 
    params.add(new BasicNameValuePair("monitors[]", "162")); 
    params.add(new BasicNameValuePair("monitors[]", "94")); 
    params.add(new BasicNameValuePair("monitors[]", "93")); 
    params.add(new BasicNameValuePair("monitors[]", "90")); 

    //Customised values 
    params.add(new BasicNameValuePair("start_date", date)); 
    params.add(new BasicNameValuePair("start_time", time)); 
    params.add(new BasicNameValuePair("end_date", date)); 
    params.add(new BasicNameValuePair("end_time", time)); 

    params.add(new BasicNameValuePair("result_type", "AVG")); 
    params.add(new BasicNameValuePair("time_base", "1")); 
    params.add(new BasicNameValuePair("singlebutton", "")); 

    return params; 
} 
private static HttpPost prepareHttpPost(String date, String time) throws UnsupportedEncodingException { 
    HttpPost httppost = new HttpPost(WEBSITE_URL); 
    // Request parameters and other properties. 
    List<NameValuePair> params = preparePostRequestParams(date, time); 


    httppost.setEntity(new UrlEncodedFormEntity(params)); 
    httppost.setHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0"); 
    httppost.setHeader("Referer", "http://www.wecare4air.co.uk/air-quality-data/brookgate-cb-1/"); 
    return httppost; 
} 

public static void getGrid(String date, String time) throws IOException { 
    HttpClient httpclient = HttpClients.createDefault(); 
    HttpPost httppost = prepareHttpPost(date, time); 

    //Execute and get the response. 
    HttpResponse response = httpclient.execute(httppost); 
    System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); 
    HttpEntity entity = response.getEntity(); 


    System.out.printf("Response length is %d\n", entity.getContentLength()); 

    if (entity != null) { 
     BufferedReader instreamReader = new BufferedReader(new InputStreamReader(entity.getContent())); 
     StringBuffer result = new StringBuffer(); 
     String line; 
     try { 
      while ((line = instreamReader.readLine()) != null) { 
       result.append(line+"\n"); 
      } 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     finally { 
      instreamReader.close(); 
      System.out.println("Response here!!:\n\n" + result); 
     } 
    } 
} 
public static void main (String[] args) { 
    try { 
     getGrid("2017-01-01", "23:00:00"); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

回答

0

你可以在你的網站URL已經一個錯字以上!您是否檢查過該頁面是否未通過AJAX請求加載?

+0

這應該是一條評論。等到你有必要的代表,不要通過發表評論作爲答案來濫用系統。 –

+0

該URL應該是正確的,因爲它與Firefox發送請求的地址相同。 我檢查了在http://stackoverflow.com/questions/1820927/request-monitoring-in-chrome 上描述的ajax,似乎沒有做出任何ajax請求,雖然有一些js腳本正在執行,所以我認爲這可能是正確的道路。 – SquattingSlavInTracksuit