1

我正在使用 google books API KEY for android 通过我的 android 应用程序加载图书数据。但我收到下面列出的错误。

但是, - 如果我从我的 API CONSOLE 中删除证书(例如,让所有应用程序都可以接受 API KEY),查询就会起作用。虽然我输入的 {SHA1};{package name} 信息是正确的。- 如果我将 API KEY 用于浏览器,则此方法有效。

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

有人可以帮忙吗?

代码:

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

4 回答 4

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();
            }
于 2014-01-05T04:13:39.407 回答
1

在标题中提供密钥与根本不提供密钥相同。检查您的开发者 api 控制台,您将不会看到使用该 api 密钥的成功查询。所以简而言之,标头中的 API 密钥并不能解决问题。如果您不想按谷歌的规则玩,只需在没有密钥的情况下进行查询。

于 2015-05-08T19:33:41.723 回答
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();
}
于 2015-01-11T11:06:35.370 回答
0

请注意,可以不受限制insecure地使用 Google API 密钥!

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

如何在 Android 中隐藏您的 API 密钥?

但这还不够。您可以将 API 密钥存储在某个地方,以便其他人也可以找到它。

要保护您的 android 应用程序的 Google 云 API 密钥,您必须将其限制为仅在您的应用程序中使用。请参阅此处了解更多信息。

在限制密钥之后,您必须在发送给 Google 的每个请求的标头中包含您的 android 应用程序包名称和 SHA-1 证书指纹。怎么做?

这就是你所需要的!:D

于 2017-03-17T14:19:52.353 回答