好吧,这可能看起来像一个愚蠢的问题,但在云计算/ Google App Engine等方面我真的很新。为了更加熟悉它,我开始使用developer.google的一些教程。 .com,基本上遵循教程,然后尝试对提供的代码片段进行小的更改,以确保我真正了解它的工作方式,而不仅仅是复制/粘贴并将一切视为理所当然。
问题在于我在以下方面遇到了一些困难: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发送的数据 - &gt;处理该数据 - &gt;在数据库中添加一些东西(存储在云中的数据库)(这是用非常原始术语解释的基本原理)。这就是为什么我真的想了解它的工作方式,到目前为止,我真的无法看到我的数据在服务器端收到的位置。我假设这背后可能有一些自动机制?如果是这样,我真的很感兴趣,如果你能指出我,我怎么能以编程方式做到这一点。
另外,我想提一下这段代码非常好用,所以没有错误,我只是在理解与之相关的所有细节方面遇到了问题。
谢谢。
稍后编辑: 我的数据库将是App Engine数据存储区。主要的问题是,我无法真正理解我的Android应用程序和Google App Engine应用程序之间的通信方式(我将使用从Android收到的数据进行所有必要的计算)。我真的可以使用更多&#34; /#34; / explainatory(用于傻瓜)代码片段,我实际上看到我从Android发送的对象是在Google App Engine应用程序中收到的。当然,我使用数据存储查看器看到了结果,它显示数据已插入数据库中。我感兴趣的是我如何实际发送我的Google App Engine应用程序中的数据,在那里接收数据并对其执行一些操作,并且仅在我将其添加到数据库中之后。
答案 0 :(得分:5)
updateBuilder()
方法不在服务器端。它是android代码的一部分。 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
方法,你会发现它正在做的是将你的调用重定向到你的localhost而不是你在appengine上部署的代码。
如果您需要澄清,请告诉我。
回答你的编辑:
暂时忘记这是一个Google端点应用程序。您基本上是在设计一个系统,它接受输入,处理输入,然后将结果保存到数据库中。
现在让我们假装输入来自终端或文件或是否调用api端点无关紧要。你绝对必须做的是创建一个层来操纵数据,然后将数据传递给持久层(即数据库)。所以你需要(仍然忽略所有Google / appengine):
JPA实体(仅限getter和setter的POJO以及JPA注释)
数据访问层:这是一个包含在JPA POJO上执行查询的方法的类(使用EntityManagerFactory
)。
业务层:这是一个操作您收到的数据的类,然后将结果传递给数据访问层。
因此你有Business logic layer => Data access layer => JPA POJO
。所以尽量不要担心它是否会在你当地的玻璃鱼或其他地方运行。
完成后,将端点注释添加到Business layer
方法中。这些注释基本上意味着在生成android endpoint library
之后,你的android将能够调用你的Business layer
方法,就好像它们在你的android应用程序代码中一样。
答案 1 :(得分:2)
我真的不明白你的问题。 “云”由Google App Engine应用程序表示。它存在于Google的服务器上,并在您创建项目时分配的URL下提供。该数据库可能是App Engine数据存储区,也可能是使用MySQL版本的Google Cloud SQL服务。