3

我想从我用于测试的移动设备上运行的 Android 应用程序访问托管在本地开发机器上的 Cloud Endpoints API。

我的设备可以通过 IP 地址访问我的开发机器。我将 --host=192.1.168.101 传递给 App Engine 启动器,以便我的本地 App Engine 实例绑定到 IP 地址。虽然我可以从 192.168.1.101 访问 App Engine 实例,但当我的应用程序进行 API 调用时,我得到了 404。

我注意到 go tohttp://192.168.1.101:9080/_ah/api/explorer/不会显示我的 API;它重定向到https://developers.google.com/apis-explorer/#p/. 如果我使用http://localhost:9080/_ah/api/explorer/,我可以按预期看到我的 API。使用 IP 地址作为主机似乎不适用于 Cloud Endpoints。

我宁愿不让我的设备根目录来更改它的 /etc/hosts 文件。无论如何,更改它可能不是解决方案,因为我无法将我的 App Engine 实例绑定到 localhost 以外的主机名。

这是我的 app.yaml 配置:

application: my-server
version: 1
runtime: python27
threadsafe: true
api_version: 1

handlers:
# Endpoints handler
- url: /_ah/spi/.*
  script: services.application

- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app
4

3 回答 3

3

您绑定到您的特定 IP,但作为提醒,您也可以绑定到 0.0.0.0(所有可用 IP)。如果您使用 maven appengine 插件并且不想在 IP 更改时更新 pom.xml 文件,这将非常方便。

接下来,确保您在同一网络上并且可以在机器之间进行连接。我通常使用 ConnectBot 进行测试,方法是打开一个 telnet 会话到您为在本地运行而定义的 IP 地址和端口。这将确保您的防火墙不会引起问题。

最后,通过调整 API 的根 url 来更新代码。如果你的 IP 地址是 192.168.1.100 并且端口是 8080,那看起来像这样:

Helloworld.Builder helloWorld = new Helloworld.Builder(AppConstants.HTTP_TRANSPORT,
    AppConstants.JSON_FACTORY, credential);
helloWorld.setRootUrl("http://192.168.1.100:8080/_ah/api/");
于 2013-09-06T22:54:57.133 回答
1

在您生成的源代码中(通常是以您的 API 名称命名的文件,例如Tictactoe.java),DEFAULT_ROOT_URL应设置为http://192.168.1.101:9080/_ah/api/. 如果您在浏览器中加载此 URL,则它不会提供任何有用的信息。相反,它是 API 请求路径的基础,例如http://192.168.1.101:9080/_ah/api/tictactoe/v1/board.

如果您想确认您的设备是否正确连接到本地服务器(通过本地网络),请 http://192.168.1.101:9080/_ah/api/explorer/从设备浏览器加载。

于 2013-09-06T21:11:24.210 回答
0

该问题与IP地址无关。我需要在我的 API 方法装饰器中包含一个路径:

@endpoints.method(HelloRequest, HelloResponse, name='helloworld', path='test', http_method='GET')
    def helloworld(self, request):
于 2013-09-07T18:57:43.723 回答