Il y a quelques jours, j'ai commencé à développer un backend pour des applications mobiles en utilisant Google App Engine et Points d'extrémité Google Cloud . Ce tutoriel montre comment les points de terminaison sont générés automatiquement, ainsi que la bibliothèque client pour Android.
Nous avons donc notre entité :
@Entity
public class Person implements IsSerializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
private String name;
//...
}
Et le point final pour cette classe :
@Api(name = "personendpoint")
public class PersonEndpoint {
@ApiMethod(name = "getPerson")
public Person getPerson(@Named("id") Long id) {
...
En outre, en utilisant la bibliothèque Android Endpoint générée (qui utilise l'API REST), je voudrais ajouter une interface utilisateur sur le serveur, construite avec Google Web Toolkit (GWT) . Mais comment dois-je manipuler la date du côté du serveur ? Je peux voir différentes approches...
Option A1 : Ajouter un service RPC dans GWT
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;
}
//...
}
Mais maintenant, mon PersonServiceImpl
y PersonEndpoint
font à peu près la même chose. Donc nous n'avons pas suivi SEC :) De plus, cette personne n'est pas autorisée à avoir com.google.appengine.api.datastore.Key
donc nous devrions changer nos Entités.
Option A2 : le service appelle la classe de points de terminaison
@Override
public Person insertPerson(Person person) {
return new PersonEndpoint().insertPerson(person);
}
Devrait fonctionner, mais toujours pas com.google.appengine.api.datastore.Key
Tapez dans l'entité et puisque les points de terminaison utilisent CollectionResponse<Person>
nous devrions le transformer en un Collection<Person>
en cas de listPerson()
.
Option B1 : Utilisation de la bibliothèque client Java Endpoint
Nous pourrions séparer le client GWT de notre backend API App Engine et utiliser les bibliothèques de client de point de terminaison générées pour Java. Ainsi, nous appelons l'API REST/Endpoint à partir d'un fichier RemoteServiceServlet
. Mais cela n'aboutirait-il pas à deux requêtes, même si le client GWT et les points de terminaison sont sur le même serveur ou même dans le même projet ?
Client GWT --(RPC)--> Serveur GWT --(Requête HTTP)--> Serveur Backend App Engine
Option B2 : Utilisation de la bibliothèque JavaScript Endpoint Client
C'est peut-être la meilleure approche, mais cela aboutirait à une JSNI massive.
Quelle est donc la meilleure pratique ? Je ne trouve pas d'exemple de projet utilisant Google Cloud Endpoints ET GWT dans un seul projet :)