android - Android 和 App Engine 实际上是如何通信的?

标签 android google-app-engine rest cloud

好吧,这可能看起来是个愚蠢的问题,但在云计算/Google App Engine 等方面我真的很陌生。为了更加熟悉它,我开始使用 developers.google 的一些教程.com,基本上遵循教程,然后尝试对提供的代码 fragment 进行小的更改,以确保我真正理解它的工作方式,而不是只是复制/粘贴并认为一切都是理所当然的。

问题是我在以下方面有点卡住了:Android 和 App Engine 实际通信的方式。我目前正在做这个教程( https://developers.google.com/eclipse/docs/endpoints-addentities ).问题是以下代码(客户端,在 Android 上):

      public class EndpointsTask extends AsyncTask<Context, Integer, Long> {
    protected Long doInBackground(Context... contexts) {

           Noteendpoint.Builder endpointBuilder = new Noteendpoint.Builder(
          AndroidHttp.newCompatibleTransport(),
          new JacksonFactory(),
          new HttpRequestInitializer() {
          public void initialize(HttpRequest httpRequest) { }
          });
  Noteendpoint endpoint = CloudEndpointUtils.updateBuilder(
  endpointBuilder).build();
  try {
      Note note = new Note().setDescription("Note Description");
      String noteID = new Date().toString();
      note.setId(noteID);

      note.setEmailAddress("E-Mail Address");          
      Note result = endpoint.insertNote(note).execute();
  } catch (IOException e) {
    e.printStackTrace();
  }
      return (long) 0;
    }
}

就我的理解而言,目前,在云计算方面,我推断 Android 和云之间的通信是通过端点对象执行的,其中端点是:

        Noteendpoint endpoint = CloudEndpointUtils.updateBuilder (endpointBuilder).build();

此外,updateBuilder() 方法如下所示:

        public static <B extends AbstractGoogleClient.Builder> B updateBuilder(
  B builder) {
if (LOCAL_ANDROID_RUN) {
  builder.setRootUrl(LOCAL_APP_ENGINE_SERVER_URL_FOR_ANDROID
      + "/_ah/api/");
}

// only enable GZip when connecting to remote server
final boolean enableGZip = builder.getRootUrl().startsWith("https:");

builder.setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() {
  public void initialize(AbstractGoogleClientRequest<?> request)
      throws IOException {
    if (!enableGZip) {
      request.setDisableGZipContent(true);
    }
  }
});

return builder;

我知道数据存储中的插入是通过 insertNote() 执行的——基本上,它执行基本的标准插入方法。

我的问题是,我无法真正理解在云中从何处捕获我从我的 Android 设备发送的信息。更具体地说,我正在发送一个对象,但我无法真正看到该对象在云中的何处被接收。可能在这种基本应用程序中,不是那么相关,但我想开发具有以下结构的应用程序:我正在使用 REST 从我的 Android 设备发送数据。我正在开发我的服务器端代码)(将在云端)。在我的服务器端代码将接收我从 Android 发送的数据 -> 处理该数据 -> 在数据库(存储在云中的数据库)中添加一些东西(这是用非常原始的术语解释的基本原理)。这就是为什么我真的很想了解它的工作方式,到目前为止,我真的看不到服务器端接收数据的位置。我假设这背后可能有一些自动机制?如果是这样,我真的很感兴趣,如果你能指出我,我该如何以编程方式做到这一点。

另外,我想提一下,这段代码工作得非常好,所以没有错误,我只是在理解与它相关的所有细节方面有问题。

谢谢。

后期编辑: 我的数据库将是 App Engine Datastore。主要问题是我无法真正理解我的 Android 应用程序和 Google App Engine 应用程序之间的通信方式(我将在其中使用从 Android 接收的数据进行所有必要的计算)。我真的可以使用一段更“明显”/解释性(对于傻瓜)的代码,我实际上看到我从 Android 发送的对象在 Google App Engine 应用程序中收到。当然,我看到了结果,使用Datastore Viewer,显示数据插入到数据库中了。我感兴趣的是,我实际上如何才能在我的 Google App Engine 应用程序中发送数据,在那里接收它并对其执行一些操作,并且只有在我将它添加到数据库之后。

最佳答案

updateBuilder() 方法不在服务器端。它是安卓代码的一部分。 CloudEndpointUtils 是 android 的一部分。这是您创建的一个类,用于为您处理样板代码,因此您不必在每次需要访问服务器时都键入它。你看代码

Noteendpoint.Builder endpointBuilder = new Noteendpoint.Builder(
      AndroidHttp.newCompatibleTransport(),
      new JacksonFactory(),
      new HttpRequestInitializer() {
      public void initialize(HttpRequest httpRequest) { }
      });

假设您的 api 名为 Noteendpoint 并且您正在“构建”一个对象来访问它。您可以调用 endpointBuilder.build() 来开始查询您的 api。如果您仔细查看 CloudEndpointUtils.updateBuilder 方法,您会发现它所做的是将您的调用重定向到您的本地主机,而不是您在应用引擎上部署的代码。

如果您需要说明,请告诉我。

回答您的编辑:

暂时忘记这是一个 Google 端点应用程序。您基本上是在设计一个系统,该系统接受输入、处理输入,然后将结果保存到数据库中。

现在让我们假设输入是来自终端、文件还是对 api 端点的调用并不重要。您绝对必须做的是创建一个层来处理数据,然后将该数据传递给您的持久层(即数据库)。因此,您将需要(仍然忽略 Google/appengine 的所有内容):

  • JPA 实体(仅具有 getter 和 setter 以及 JPA 注释的 POJO)

  • 数据访问层:这是一个类,其中包含对 JPA POJO 执行查询的方法(使用 EntityManagerFactory)。

  • 业务层:这是一个类,您可以在其中处理接收到的数据,然后将结果传递给数据访问层。

因此你有 业务逻辑层 => 数据访问层 => JPA POJO。因此,无论它是要在您本地的 glassfish 上还是在任何地方运行,都无需担心。

完成后,将端点注释添加到您的业务层 方法。这些注释基本上意味着在您生成 android 端点库 之后,您的 android 将能够调用您的 业务层 方法,就好像它们就在您的 android 应用程序代码中一样。

你明白了吗?就好像你的机器人和你的服务器是一体的。您是否为此项目使用了 Google Eclipse 插件?

关于android - Android 和 App Engine 实际上是如何通信的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15814479/

相关文章:

android - 音频录制和播放环回缓冲区问题,将数据写入音轨时出现问题

android - AAR 缺少我的依赖项

java - Google Cloud Storage 按名称对目录进行排序

firebase - Firestore 模拟器 REST API 身份验证

PHP REST 客户端 API 调用

java - 如何设置 onItemClick 方法以显示我在 ListView 中单击的文本?

android - 在android中更改微调器的主题

python - 错误值错误 : Property text is required

PHP 搜索引擎与 MySQL 数据库中的特定术语不匹配

rest - Add->REST API Client... 命令在 VS2015 中失败