首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法连接到远程API

无法连接到远程API
EN

Stack Overflow用户
提问于 2016-09-30 11:13:17
回答 2查看 2.1K关注 0票数 1

我正试图通过以下指南从本地计算机访问数据:

https://cloud.google.com/appengine/docs/java/tools/remoteapi

我遵循了指南并更改了web.xml,部署了代码,安装了云sdk,运行了"gcloud init“命令并选择了项目,但是在运行示例代码时我得到了一个异常:

代码语言:javascript
复制
Exception in thread "main" java.lang.RuntimeException: Failed to acquire Google Application Default credential.
    at com.google.appengine.tools.remoteapi.RemoteApiOptions.useApplicationDefaultCredential(RemoteApiOptions.java:169)
    at androidlost_remote.RemoteTest.main(RemoteTest.java:14)
Caused by: java.io.IOException: The Application Default Credentials are not available. They are available if running on Google App Engine, Google Compute Engine, or Google Cloud Shell. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
    at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredential(DefaultCredentialProvider.java:98)
    at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:213)
    at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:191)
    at com.google.appengine.tools.remoteapi.RemoteApiOptions.useApplicationDefaultCredential(RemoteApiOptions.java:164)
    ... 1 more

这是我的代码:

代码语言:javascript
复制
import java.io.IOException;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.tools.remoteapi.RemoteApiInstaller;
import com.google.appengine.tools.remoteapi.RemoteApiOptions;

public class RemoteTest {

    public static void main(String[] args) throws IOException {
        RemoteApiOptions options = new RemoteApiOptions().server("myappid-hr.appspot.com", 443).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!")));
        } finally {
            installer.uninstall();
        }
    }
}

有谁知道怎么解决这个问题吗?

更新:

现在证书似乎是固定的。但是,现在堆栈跟踪返回一个302:

代码语言:javascript
复制
Exception in thread "main" com.google.appengine.repackaged.com.google.api.client.http.HttpResponseException: 302 Found
    at com.google.appengine.repackaged.com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1070)
    at com.google.appengine.tools.remoteapi.OAuthClient.get(OAuthClient.java:64)
    at com.google.appengine.tools.remoteapi.RemoteApiInstaller.getAppIdFromServer(RemoteApiInstaller.java:413)
    at com.google.appengine.tools.remoteapi.RemoteApiInstaller.loginImpl(RemoteApiInstaller.java:376)
    at com.google.appengine.tools.remoteapi.RemoteApiInstaller.login(RemoteApiInstaller.java:337)
    at com.google.appengine.tools.remoteapi.RemoteApiInstaller.install(RemoteApiInstaller.java:173)
    at androidlost_remote.RemoteTest3.main(RemoteTest3.java:16)

根据这个帖子,当服务器没有在web.xml中获得远程api时,就会发生这种情况,但我已经这样做了。服务器端还有什么需要的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-30 13:53:18

创建一个新的证书,给它正确的IAM访问权限,下载json,最后在使用api之前使用它。:)

代码语言:javascript
复制
Make sure remote API is enabled

<servlet>
<display-name>Remote API Servlet</display-name>
<servlet-name>RemoteApiServlet</servlet-name>
<servlet-class>com.google.apphosting.utils.remoteapi.RemoteApiServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RemoteApiServlet</servlet-name>
<url-pattern>/remote_api</url-pattern>
</servlet-mapping>

RemoteApiOptions raoptions = new RemoteApiOptions() .server("my-module-dot-my-project.appspot.com", 443) .useServiceAccountCredential("my-service-account-id", "my-p12-file.p12"); 

阅读更多这里

票数 0
EN

Stack Overflow用户

发布于 2016-09-30 12:42:23

好吧,让我们分析一下错误代码。错误代码的第一行:Failed to acquire Google Application Default credential.告诉您哪些工作不正常(无法获得GAD证书)。

下一行注意事项是:at androidlost_remote.RemoteTest.main(RemoteTest.java:14)。这告诉您,错误是在remoteTest类的第14行上引起的。

第14行是installer.install(options);。这将指向RemoteApiOptions options变量。确保.options()论证指向正确的and服务器和端口。

现在回到错误代码,第4行直接告诉您发生错误的原因:java.io.IOException。它说,这是因为They are available if running on Google App Engine, Google Compute Engine, or Google Cloud Shell.所有的我猜你没有。因此,错误代码告诉您需要做什么,以及去哪里寻求帮助。您需要安装、引擎或。

要么安装其中一个/全部,要么必须定义环境变量GOOGLE_APPLICATION_CREDENTIALS,指向定义凭据的文件。

从错误代码第4行:https://developers.google.com/accounts/docs/application-default-credentials获得更多信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39790201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档