Httpclient предоставляет разные результаты

У меня проблемы с взаимодействием с системой 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();
        }
}

Примечание: нет никаких проблем с аутентификацией, страница возвращается нормально, за исключением этой детали.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Насколько я понимаю,

HttpPost postMethod = new HttpPost(baseUrl + "guardian/home.html");

home.html, не содержащий сценариев серверного сайта, можете ли вы заполнить свои данные с помощью javascript или чего-то еще, вызвав другой api с помощью вызова Ajax.

так из java,

HttpResponse resp2 = client.execute(getMethod);

он принимает html и отвечает на html,

Да, html-страница действительно содержит JavaScript, но в других системах, которые не используют JavaScript (например, request.py или postman), область по-прежнему заполнена контентом.

dnsge 25.09.2018 04:37

лучше, если вы поделитесь home.html

Md Mahamudul Hasan 25.09.2018 04:38
Ответ принят как подходящий

В итоге я использовал Jsoup, следуя той же логике, и получил желаемый результат. По-прежнему не понимаю, почему HttpClient не работал.

Другие вопросы по теме