我正在尝试使用远程 API 从另一个 GAE 项目访问一个应用程序的数据存储。 我正在使用以下代码:
String serverString = "http://example.com";//this should be the target appengine
RemoteApiOptions options;
if (serverString.equals("localhost")) {
options = new RemoteApiOptions().server(serverString, 8080).useDevelopmentServerCredential();
} else {
options = new RemoteApiOptions().server(serverString, 80).useApplicationDefaultCredential();
}
RemoteApiInstaller installer = new RemoteApiInstaller();
installer.install(options);
datastore = DatastoreServiceFactory.getDatastoreService();
try {
results = datastore.get(KeyFactory.createKey("some key"));
} catch (EntityNotFoundException e) {
e.printStackTrace();
return null;
}
当我在本地运行它时,我在installer.install(options);
处得到一个空指针异常。 部署时,从应用程序引擎上的错误报告中看到的错误是:HttpResponseException: 401 You must be logged in as an administrator, or access from an approved application.
话虽如此,我用下面的代码做了一个小的java应用程序:
String serverString = "http://example.com";//same string as the one used in the above code
RemoteApiOptions options;
if (serverString.equals("localhost")) {
options = new RemoteApiOptions().server(serverString, 8080).useDevelopmentServerCredential();
} else {
options = new RemoteApiOptions().server(serverString, 80).useApplicationDefaultCredential();
}
RemoteApiInstaller installer = new RemoteApiInstaller();
installer.install(options);
try {
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
System.out.println("Key of new entity is " + ds.put(new Entity("Hello Remote API!")));
这个有效!!添加了你好远程 API 实体。
在 App Engine 上运行时与在本地运行时不起作用的原因与正在获取的凭据有关。在本地运行时,可能会使用您自己的凭据(可以访问这两个项目);相比之下,在 App Engine 上运行时,您可能会选择只能访问该 App Engine 项目的默认服务帐号。
尝试通过打开云控制台的云 IAM 部分来解决此问题,以查找包含您要访问的云数据存储的项目。在此处,向其他项目正在使用的默认 App Engine 服务帐号授予适当级别的访问权限。
如果您不希望其他项目中的所有 App Engine 服务都具有此类访问权限,则还可以考虑为此跨项目访问权限生成一个服务帐号,并授予该访问权限(而不是向默认 App Engine 服务帐号授予该访问权限)。然后,在调用 API 的代码中,您可以通过调用 useServiceAccountCredential() 方法显式使用该服务帐号RemoteApiOptions
,以确保发出的 API 请求使用指定的服务帐号,而不是默认的 App Engine 服务帐号。