httpclient дает разные результаты - PullRequest
0 голосов
/ 25 сентября 2018

У меня проблемы с подключением к системе PowerSchool с использованием Apache HttpClient 4.5.6.Я упустил методы, которые не нужны для этого вопроса, но я на 100% уверен, что они работают так, как задумано.

При использовании Postman или request.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 -->

Разрыв между двумя различными результатами не имеет смысла для меня, посколькунасколько я знаю Почтальон иquesses.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();
        }
}

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

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

0 голосов
/ 25 сентября 2018

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

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

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

так из Java,

HttpResponse resp2 = client.execute(getMethod);

он принимает HTML и ответ HTML,

...