Получение более 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 включительно.