У меня проблемы с взаимодействием с системой PowerSchool с помощью Apache HttpClient 4.5.6. Я пропустил методы, которые не нужны для ответа на этот вопрос, но я на 100% уверен, что они работают так, как задумано.
При использовании Postman или requests.py с использованием тех же данных формы (я проверил их на python, java и Firefox) я получаю заданную HTML-страницу с желаемыми оценками и информацией о классе между комментариями <!-- start student content --> и <!-- end student content --> ( более 1000 строк). Однако при использовании тех же данных формы и заголовки в Java результирующая HTML-страница содержит только следующее:
<!-- start student content -->
<div id = "quickLookup">
<tr>
<th class = "right" colspan = "19">Attendance Totals</th>
<th>0</th>
<th>0</th>
</table>
<table border = "0" cellpadding = "3" cellspacing = "1" width = "100%">
<tr>
<td align = "center">Current Cumulative GPA (Q1): X.XXXX</td>
</tr>
<tr>
<td align = "center"><a href = "home.html?schoolid=XXXX&showdropped=true&91146885685933636948">Show dropped classes also</a></td>
</tr>
</table>
<tr>
<th class = "right" colspan = "10">Attendance Totals</th>
<th>0</th>
<th>0</th>
<th>0</th>
<th>0</th>
</table>
</div>
<!-- end student content -->
Разрыв между двумя разными результатами не имеет для меня никакого смысла, поскольку, насколько я знаю, Postman и requests.py не выполняют javascript. Я ожидал, что результат HttpClient будет таким же. Вот мой код:
private static final BasicCookieStore cookieStore = new BasicCookieStore();
private static final HttpClient client = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build();
public static void main(String[] args) {
String baseUrl = "https://powerschoolinstallurl/";
String username = "username";
String password = "password";
try {
// get hidden data fields, calc hmac data
HashMap<String, String> result = getAuthCodes(baseUrl);
String dbpwField = getDBPWField(result.get("contextData"), password);
String pwField = getPWField(result.get("contextData"), password);
List<NameValuePair> form = new ArrayList<>();
form.add(new BasicNameValuePair("pstoken", result.get("pstoken")));
form.add(new BasicNameValuePair("contextData", result.get("pstoken")));
form.add(new BasicNameValuePair("dbpw", dbpwField));
form.add(new BasicNameValuePair("serviceName", "PS Parent Portal"));
form.add(new BasicNameValuePair("pcasServerURL", "/"));
form.add(new BasicNameValuePair("credentialType", "User Id and Password Credential"));
form.add(new BasicNameValuePair("account", username));
form.add(new BasicNameValuePair("pw", pwField));
form.add(new BasicNameValuePair("ldappassword", password));
UrlEncodedFormEntity requestEntity = new UrlEncodedFormEntity(form);
HttpPost postMethod = new HttpPost(baseUrl + "guardian/home.html");
postMethod.setEntity(requestEntity);
HttpResponse rawResponse = client.execute(postMethod);
System.out.println(rawResponse.getStatusLine().getStatusCode());
try {
String responseString = new BasicResponseHandler().handleResponse(rawResponse);
System.out.println(responseString);
} catch (HttpResponseException ignore) {}
System.out.println(cookieStore.getCookies().toString());
HttpGet getMethod = new HttpGet(baseUrl + "guardian/home.html");
// replicating headers, result is the same nontheless
getMethod.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
getMethod.setHeader("Accept-Encoding", "gzip, deflate, br");
getMethod.setHeader("Accept-Language", "en-US,en;q=0.5");
getMethod.setHeader("Referer", "https://powerschoolinstallurl/public/home.html");
getMethod.setHeader("DNT", "1");
getMethod.setHeader("Connection", "keep-alive");
getMethod.setHeader("Cache-Control", "no-cache");
getMethod.setHeader("Host", "ps.install.domain");
getMethod.setHeader("Upgrade-Insecure-Requests", "1");
getMethod.setHeader("Pragma", "no-cache");
HttpResponse resp2 = client.execute(getMethod);
String responseString2 = new BasicResponseHandler().handleResponse(resp2);
System.out.println(responseString2);
} catch (IOException e) {
e.printStackTrace();
}
}
Примечание: нет никаких проблем с аутентификацией, страница возвращается нормально, за исключением этой детали.




Насколько я понимаю,
HttpPost postMethod = new HttpPost(baseUrl + "guardian/home.html");
home.html, не содержащий сценариев серверного сайта, можете ли вы заполнить свои данные с помощью javascript или чего-то еще, вызвав другой api с помощью вызова Ajax.
так из java,
HttpResponse resp2 = client.execute(getMethod);
он принимает html и отвечает на html,
лучше, если вы поделитесь home.html
В итоге я использовал Jsoup, следуя той же логике, и получил желаемый результат. По-прежнему не понимаю, почему HttpClient не работал.
Да, html-страница действительно содержит JavaScript, но в других системах, которые не используют JavaScript (например, request.py или postman), область по-прежнему заполнена контентом.