几天前,我开始使用 Google App Engine 和Google Cloud Endpoints为移动应用程序开发后端。本教程展示了端点是如何自动生成的,以及适用于 Android 的客户端库。
所以我们有我们的实体:
@Entity
public class Person implements IsSerializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
private String name;
//...
}
这个类的端点:
@Api(name = "personendpoint")
public class PersonEndpoint {
@ApiMethod(name = "getPerson")
public Person getPerson(@Named("id") Long id) {
...
此外,使用生成的 Android 端点库(使用 REST API),我想在服务器上添加一个用户界面,使用Google Web Toolkit (GWT)构建。但是我应该如何操作服务器端的日期呢?我可以看到不同的方法...
选项 A1:在 GWT 中添加 RPC 服务
public interface PersonServiceAsync {
void insertPerson(Person person, AsyncCallback<Person> callback);
}
@RemoteServiceRelativePath("api")
public interface PersonService extends RemoteService {
public Person insertPerson(Person person);
}
public class PersonServiceImpl extends RemoteServiceServlet implements PersonService{
public Person insertPerson(Person person) {
EntityManager mgr = getEntityManager();
try {
if (containsPerson(person)) {
throw new EntityExistsException("Object already exists");
}
mgr.persist(person);
} finally {
mgr.close();
}
return person;
}
//...
}
但现在我的PersonServiceImpl
和PersonEndpoint
做的大致相同。所以我们没有遵循DRY :) 此外,不允许那个人有,com.google.appengine.api.datastore.Key
所以我们必须改变我们的实体。
选项 A2:服务调用端点类
@Override
public Person insertPerson(Person person) {
return new PersonEndpoint().insertPerson(person);
}
应该可以工作,但com.google.appengine.api.datastore.Key
实体中仍然没有类型,并且由于端点正在使用CollectionResponse<Person>
,我们必须将其转换Collection<Person>
为listPerson()
.
选项 B1:使用 Java 端点客户端库
我们可以将 GWT 客户端从我们的 App Engine API 后端中分离出来,并使用生成的 Java 端点客户端库。因此,我们从RemoteServiceServlet
. 但是,即使 GWT 客户端和 Endpoints 在同一台服务器上或什至在同一项目中,这不会以两个请求结束吗?
GWT 客户端 --(RPC)--> GWT 服务器 --(HTTP 请求)--> App Engine 后端服务器
选项 B2:使用 JavaScript 端点客户端库
可能是最好的方法,但最终会导致大量的 JSNI。
那么最佳实践是什么?我在一个项目中找不到任何使用 Google Cloud Endpoints 和 GWT 的示例项目 :)