Google Книги API для Android - доступ не настроен
Я использую Google KEY API для Android, чтобы загрузить данные книги через мое приложение для Android. Но я получаю ошибку, указанную ниже.
Однако, - запрос работает, если я удаляю сертификаты из моей КОНСОЛИ API (например, делаю API KEY приемлемым для всех Приложений). Хотя мои данные {SHA1};{имя пакета}, которые я указал, верны. - Это работает, если я использую API KEY для браузера.
Следовательно, что я могу понять, я не могу отправить KEY как часть URL в методе httpclient. Может быть, мне нужно отправить через заголовок или что-то. Но я не могу найти как.
Кто-нибудь может помочь, пожалуйста?
КОД:
String link = "https://www.googleapis.com/books/v1/volumes?key=MY_KEY&q="+query+"&projection=full&langRestrict=en&maxResults=1";
HttpGet get = new HttpGet(link);
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 10000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
HttpConnectionParams.setSoTimeout(httpParameters, timeoutConnection);
HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpclient.execute(get);
HttpEntity entity = response.getEntity();
Запрос:
https://www.googleapis.com/books/v1/volumes?key=MY_API_KEY&q=intitle:'The+Old+Man+And+The+Sea'+inauthor:'Ernest+Hemingway'&projection=full&langRestrict=en&maxResults=1
Результат:
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "accessNotConfigured",
"message": "Access Not Configured"
}
],
"code": 403,
"message": "Access Not Configured"
}
}
4 ответа
Для кого это может касаться... Я отправляю свой ключ API в заголовке, и теперь он работает.. Я не уверен, что это правильный путь, хотя...
String link = "https://www.googleapis.com/books/v1/volumes?q="+params;
InputStream is = null;
try
{
int timeoutConnection = 10000;
URL url = new URL(link);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(timeoutConnection);
con.setReadTimeout(timeoutConnection);
con.setRequestProperty("key", "API_KEY");
if(con.getResponseCode() != HttpURLConnection.HTTP_OK){
publishProgress("Error conneting.");
}
is=con.getInputStream();
}
Предоставление ключа в заголовке - это то же самое, что вообще не указывать ключ. Проверьте консоль API разработчика, и вы не увидите успешных запросов с этим ключом API. Короче говоря, ключ API в заголовке не решает проблему. Если вы не хотите играть по правилам Google, просто сделайте запрос без ключа вообще.
Вы можете добиться того же результата принятого ответа, используя HttpGet
:
String API_KEY = "..."; // Google Books API Public key
String ISBN = "...";
String bookSearchString = "https://www.googleapis.com/books/v1/volumes?q=isbn:" + ISBN;
HttpClient bookClient = new DefaultHttpClient();
try
{
//get the data
HttpGet bookGet = new HttpGet(bookSearchURL);
bookGet.addHeader("key", API_KEY);
HttpResponse bookResponse = bookClient.execute(bookGet);
StatusLine bookSearchStatus = bookResponse.getStatusLine();
if (bookSearchStatus.getStatusCode() == 200)
{
//we have a result
HttpEntity bookEntity = bookResponse.getEntity();
...
}
} catch (Exception e)
{
e.printStackTrace();
}
Обратите внимание, что использование ключа API Google без ограничений является insecure
способ сделать!
Очевидно, что если с вас взимают плату за доступ к данным API, вы не хотите, чтобы кто-то декомпилировал ваш APK, нашел ключ API и затем начал использовать его в своих собственных приложениях.
Как скрыть свой ключ API в Android?
Но этого недостаточно. Вы можете хранить свой ключ API где-нибудь, чтобы кто-то тоже мог его найти.
Чтобы защитить ключ API облака Google для вашего приложения для Android, вы должны ограничить его использование только из своего приложения. Смотрите здесь для получения дополнительной информации.
После ограничения ключа вы должны указать имя пакета приложения для Android и отпечаток сертификата SHA-1 в заголовке каждого запроса, отправляемого в Google. Как сделать?
Это все, что вам нужно!:D