Итак, у меня есть этот 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 идентификаторов.