Конвертировать PHP curl запрос в Java - PullRequest
0 голосов
/ 22 ноября 2018

Итак, у меня есть этот PHP-код, который отправляет запрос POST на указанный URL-адрес.Массив $ data действует как фильтр для применения к запросу (например, для отображения второй страницы и максимум 10 элементов для этой страницы).По умолчанию это значения "currentPage => 1" и "itemsPerPage => 100" (я обращаюсь к API).

<?php

$usercode = '';
$username = '';
$password = '';
$URL = '';

$data =
    array (
        'currentPage' => 2,
        'itemsPerPage' => 10
    );

$hash = sha1(http_build_query($data) . sha1($password));

$requestData = array(
    'code' => $usercode,
    'username' => $username,
    'data' => $data,
    'hash' => $hash);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($requestData));

$result = curl_exec($ch);

$json_pretty = json_encode(json_decode($result), JSON_PRETTY_PRINT);
echo $json_pretty;

Это работает точно так, как задумано с использованием языка PHP, но я хочу добитьсятакое же поведение в Java.Проблема в том, что фильтры не применяются (для каждого запроса значения фильтров игнорируются и используются значения по умолчанию).Я пытался сделать запрос в той же форме, что и в PHP, но по какой-то причине фильтры не применяются.Это моя попытка использовать Apache HttpClient:

public class Foo
{
    private static String httpBuildQuery(List<? extends NameValuePair> parameters) {
        return URLEncodedUtils.format(parameters, "UTF-8").replace("*", "%2A");
    }

    public static void main(String[] args)
    {
        String username = "";
        String password = "";
        String usercode = "";
        final String URL = "";

        String headerValueToBeEncoded = username + ":" + password;
        String encodedHeaderValue = Base64.getEncoder().encodeToString(headerValueToBeEncoded.getBytes());

        List<NameValuePair> data = new ArrayList<>();
        data.add(new BasicNameValuePair("currentPage", "2"));
        data.add(new BasicNameValuePair("itemsPerPage", "10"));

        String passwordHash = DigestUtils.sha1Hex(password);
        String dataQueryString = Foo.httpBuildQuery(data);
        String valueToBeHashed = dataQueryString + passwordHash;
        String hash = DigestUtils.sha1Hex(valueToBeHashed);

        List<NameValuePair> requestData = new ArrayList<>();
        requestData.add(new BasicNameValuePair("code", usercode));
        requestData.add(new BasicNameValuePair("username", username));
        requestData.add(new BasicNameValuePair("data", data.toString()));
        requestData.add(new BasicNameValuePair("hash", hash));

        String requestDataQueryString = Foo.httpBuildQuery(requestData);

        try (CloseableHttpClient client = HttpClientBuilder.create().build())
        {
            HttpPost request = new HttpPost(URL);
            request.setHeader("Authorization", "Basic " + encodedHeaderValue);
            request.setEntity(new StringEntity(requestDataQueryString));

            HttpResponse response = client.execute(request);

            BufferedReader bufReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            StringBuilder builder = new StringBuilder();
            String line;

            while ((line = bufReader.readLine()) != null)
            {
                builder.append(line);
                builder.append(System.lineSeparator());
            }

            JSONObject jsonObject = new JSONObject(builder.toString());
            JSONArray jsonArray = jsonObject.getJSONArray("results");

            for(int i=0; i < jsonArray.length(); i++)
            {
                System.out.println(jsonArray.getJSONObject(i).get("id"));
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

Значения предопределенных предопределенных строк (имя пользователя, пароль и т. Д.) Здесь оставлены пустыми, поскольку они содержат конфиденциальную информацию.В последней части я напечатал только значения идентификаторов, чтобы проверить, были ли применены фильтры, но для каждого запроса он печатает 100 идентификаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...