Получение более 10 результатов с помощью API Google Custom Search API V1 в Java

Я использую API Google Custom Search API на Java, чтобы получить результаты Google в ответ на запрос. Я написал этот код с помощью других сообщений, код выглядит следующим образом:

    url = new URL("https://www.googleapis.com/customsearch/v1?key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+0+"&num="+30);
    HttpURLConnection conn2 = (HttpURLConnection) url.openConnection();
    System.out.println("Connection opened!");
    conn2.setRequestMethod("GET");
    conn2.setRequestProperty("Accept", "application/json");
    BufferedReader br = new BufferedReader(new InputStreamReader(
    (conn2.getInputStream())));

Проблема в том, что всякий раз, когда я использую приведенный выше код без параметров num и start, он выполняется правильно, но дает только 10 лучших результатов. Поэтому я использовал параметры num и start. Но они создают проблемы. Здесь я не могу понять, где указать параметры num и start в URL-адресе. Он всегда дает HTTP 400, т.е. Плохой запрос. Я прочитал страницу "Документация", там также нет четкой инструкции о том, где разместить эти два параметра в Url.

Итак, если кто-нибудь поможет мне решить эту проблему, я буду очень благодарен. Спасибо.

Ответ 1

Вы не можете так поступать. num может быть не более 10. См.

https://developers.google.com/custom-search/v1/using_rest#query-params

num Количество результатов поиска для возврата
Вы можете указать, сколько результаты для текущего поиска. Допустимые значения - целые числа от 1 до 10 включительно. Если num не используется, значение 10 равно предполагается.

Чтобы показать больше результатов, Google предлагает сделать несколько вызовов, при необходимости увеличивая параметр запуска:

http://support.google.com/customsearch/bin/answer.py?hl=en&answer=1361951

Google Custom Search и Google Site Search возвращают до 10 результатов за запрос. Если вы хотите отобразить пользователю более 10 результатов, вы можете выдать несколько запросов (используя start = 0, start = 11... параметры) и отображать результаты на одной странице. В этом случае, Google будет рассматривать каждый запрос как отдельный запрос, и если вы используя Google Site Search, каждый запрос будет учитывать ваш лимит.

Ответ 2

Во-первых, Google говорит: "Параметры запроса, которые вы можете использовать с API пользовательского поиска JSON/Atom, приведены в этом разделе. Все значения параметров должны быть закодированы в URL". https://developers.google.com/custom-search/v1/using_rest#query-params Значит, что все после "?" должен быть закодирован с эквивалентом php url encoder, который устанавливает стандарт для urlencoding. Дело в том, что Java-класс URLEncoder не совсем прав, вам нужно сделать пару replaceAll. Вам нужно сделать это для ввода:

String queryArguments = "key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+"0"+"&num="+"30";

Обратите внимание, что вокруг чисел есть кавычки. Если вы их используете из переменных, используйте следующее:

String thenum = Integer.toString(theinteger);

И затем правильная кодировка

String addition = URLEncoder.encode(queryArguments, "UTF-8")
.replaceAll("\\%28", "(") 
.replaceAll("\\%29", ")") 
.replaceAll("\\+", "%20") 
.replaceAll("\\%27", "'") 
.replaceAll("\\%21", "!") 
.replaceAll("\\%7E", "~");

Затем вы добавляете это к исходному некодированному URL:

String url = "https://www.googleapis.com/customsearch/v1?"
String total = url + addition;

В заключение ваш код будет выглядеть так:

String query = URLEncoder.encode("key="+key+ "&cx="+ cx +"&q="+    searchText+"&alt=json"+"&start="+"0"+"&num="+"30"), "UTF-8").replaceAll("\\%28", "(") 
.replaceAll("\\%29", ")") 
.replaceAll("\\+", "%20") 
.replaceAll("\\%27", "'") 
.replaceAll("\\%21", "!") 
.replaceAll("\\%7E", "~");
URL url = new URL("https://www.googleapis.com/customsearch/v1?" + query);
HttpURLConnection conn2 = (HttpURLConnection) url.openConnection();
System.out.println("Connection opened!");
conn2.setRequestMethod("GET");
conn2.setRequestProperty("Accept", "application/json");
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn2.getInputStream())));

Надеюсь, это сработает для вас. Я сделал что-то очень похожее на старое устаревшее изображение api, но концепция придерживается того же самого, и я посмотрел на новые документы.:)

EDIT: Убедитесь, что ваш параметр num находится в диапазоне от 0 до 10 включительно.