我使用这个作为我的请求网址:
`String isbnUrl = "https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn + "&key=" + myAPIKEY;`
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么我一直得到这个回应:
{
"error":{
"errors":[
{
"domain":"usageLimits",
"reason":"ipRefererBlocked",
"message":"There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed.",
"extendedHelp":"https://console.developers.google.com"
}
],
"code":403,
"message":"There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed."
}
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了使用调试密钥库和发布密钥库为我的Android应用程序获取API的过程,似乎无法使其工作我尝试将我的密钥添加为标题,如下所示: Google Books API 403未配置访问.
我认为这是答案,但后来意外地意识到它与完全不提供密钥相同.在输入错误的String作为键后,我开始意识到这一点,它仍然有效.
在开发人员控制台中,我看到它在使用响应代码部分从我的API接收请求:客户端错误(4xx).
如果有人知道如何通过包含密钥来使这个API以Google想要的方式工作,我将非常感谢任何帮助.
问题是在为 Android 应用程序设置 API 密钥限制时,您指定了包名称和 SHA-1 证书指纹。因此,您的 API 密钥将仅接受来自您的应用程序且指定了包名称和 SHA-1 证书指纹的请求。
因此,当您向 Google 发送请求时,您必须使用以下键在每个请求的标头中添加这些信息:
键:"X-Android-Package"
,值:您的应用程序包名称
键:"X-Android-Cert"
,值:您的 apk 的 SHA-1 证书
首先,获取您的应用程序 SHA 签名(您将需要 Guava 库):
/**
* Gets the SHA1 signature, hex encoded for inclusion with Google Cloud Platform API requests
*
* @param packageName Identifies the APK whose signature should be extracted.
* @return a lowercase, hex-encoded
*/
public static String getSignature(@NonNull PackageManager pm, @NonNull String packageName) {
try {
PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
if (packageInfo == null
|| packageInfo.signatures == null
|| packageInfo.signatures.length == 0
|| packageInfo.signatures[0] == null) {
return null;
}
return signatureDigest(packageInfo.signatures[0]);
} catch (PackageManager.NameNotFoundException e) {
return null;
}
}
private static String signatureDigest(Signature sig) {
byte[] signature = sig.toByteArray();
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] digest = md.digest(signature);
return BaseEncoding.base16().lowerCase().encode(digest);
} catch (NoSuchAlgorithmException e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在请求头中添加包名和SHA证书签名:
java.net.URL url = new URL(REQUEST_URL);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
try {
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
connection.setRequestProperty("Accept", "application/json");
// add package name to request header
String packageName = mActivity.getPackageName();
connection.setRequestProperty("X-Android-Package", packageName);
// add SHA certificate to request header
String sig = getSignature(mActivity.getPackageManager(), packageName);
connection.setRequestProperty("X-Android-Cert", sig);
connection.setRequestMethod("POST");
// ADD YOUR REQUEST BODY HERE
// ....................
} catch (Exception e) {
e.printStackTrace();
} finally {
connection.disconnect();
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看完整答案。
享受编码的乐趣:D
归档时间: |
|
查看次数: |
1133 次 |
最近记录: |