适用于Android的Google Books API - 未配置访问权限

时间:2013-12-29 12:11:39

标签: android google-api google-books

我使用谷歌书籍API KEY为Android通过我的Android应用程序加载书籍数据。但是我在下面列出了错误。

然而, - 如果我从API CONSOLE中删除证书,则查询有效(例如,使所有应用程序都可以接受API KEY)。虽然我提供的{SHA1}; {包名}信息是正确的。 - 如果我使用API​​ KEY代替浏览器,这是有效的。

因此,我能理解的是,我无法在httpclient方法中将KEY作为url的一部分发送。可能是我需要通过标题或其他东西发送。但我找不到。

有人可以帮忙吗?

CODE:

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 个答案:

答案 0 :(得分: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();
            }

答案 1 :(得分:1)

在标题中提供密钥与完全不提供密钥相同。检查您的开发人员api控制台,您将看不到使用该api密钥的成功查询。简而言之,标头中的API密钥无法解决问题。如果您不想按照谷歌规则进行游戏,只需在没有密钥的情况下进行查询。

答案 2 :(得分:0)

您可以使用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();
}

答案 3 :(得分:0)

请注意,无限制地使用Google API密钥是 insecure 的方法!

  

显然,如果您因为访问API数据而被收费,那么您不希望有人反编译您的APK,找到您的API密钥,然后开始在自己的应用中使用它。

How to hide your API Key in Android?

但这还不够。您可以将API密钥存储在某个位置,以便有人也可以找到它。

要确保Android应用的Google云API密钥,您必须将其限制为仅在您的应用中使用。有关详情,请参阅here

在限制密钥后,您必须在要发送给Google的每个请求的标头中包含您的Android应用包名称和SHA-1证书指纹。 How to do?

这就是你所需要的! :d