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();
}
}
}
這應該是一條評論。等到你有必要的代表,不要通過發表評論作爲答案來濫用系統。 –
該URL應該是正確的,因爲它與Firefox發送請求的地址相同。 我檢查了在http://stackoverflow.com/questions/1820927/request-monitoring-in-chrome 上描述的ajax,似乎沒有做出任何ajax請求,雖然有一些js腳本正在執行,所以我認爲這可能是正確的道路。 – SquattingSlavInTracksuit