Comment exposer un service Web RESTful à l’aide de Meteor

Comment feriez-vous pour créer un service Web reposant avec Meteor? Je voudrais créer des applications dans Appcelerator qui se connectent au même backend.

Est-ce que Meteor peut résoudre ce problème?

Je suppose que vous pourriez probablement créer un service RESTful en utilisant Meteor, mais ce n’est pas vraiment ce à quoi la structure est destinée – l’un des principaux avantages de Meteor est une interaction étroite entre le client et le serveur, et un service Web n’a pas côté client. Je recommande de regarder soit écrire un back-end de service Web dans node.js seul ou quelque chose comme https://github.com/insortingdea/grape si vous aimez Ruby.

J’ai fait une description complète à ce sujet dans Meteorpedia:

http://www.meteorpedia.com/read/REST_API

La publication examine les 6 options de création d’interfaces REST, du plus haut niveau (par exemple, les paquets intelligents qui gèrent tout pour vous) au niveau le plus bas (par exemple, en écrivant votre propre connectHandler).

De plus, le post couvre l’utilisation de l’interface REST, c’est la bonne ou la mauvaise chose à faire dans Meteor, il fait référence aux outils de test Meteor REST et explique les problèmes courants comme les problèmes de sécurité CORS.

J’ai d’abord répondu à cette question ici , mais pour récapituler:

Pour append des méthodes RESTful à vos données, consultez l’API Collection écrite pour Meteor:

https://github.com/crazytoad/meteor-collectionapi

En ce qui concerne l’authentification pour accéder à la firebase database, consultez ce projet:

https://github.com/meteor/meteor/wiki/Getting-started-with-Auth

Les deux sont clairement en développement, mais vous pouvez créer une API RESTful et l’intégrer facilement à un client natif mobile.

Je sais que c’est un vieux thread, mais au cas où quelqu’un y tomberait, j’ai publié un paquet pour écrire des API REST dans Meteor 0.9.0+:

https://github.com/kahmali/meteor-restivus

Il a été inspiré par RestStop2 et construit avec le routage côté serveur de Iron Router . À mon humble avis, c’est une meilleure solution que tout ce qui a été posté ici jusqu’à présent.

MISE À JOUR: Pour clarifier pourquoi je pense que c’est une “meilleure” solution que celles mentionnées, je soulignerai simplement les différences entre chacun:

CollectionAPI:
CollectionAPI se limite à exposer des opérations CRUD de base sur vos collections. Pour mon utilisation, qui consum l’API REST dans les applications mobiles, l’envoi de documents entiers peut s’avérer extrêmement coûteux et, la plupart du temps, je dois effectuer un traitement supplémentaire des données (par exemple, envoyer un message Google Cloud dans un ordinateur). Endpoint REST pour l’ajout d’un ami, mais uniquement si l’ami a été ajouté avec succès). CollectionAPI vous donne un hook qui s’exécute avant que le noeud final ne soit exécuté, mais d’après ce que j’ai compris, il n’y a rien immédiatement avant la réponse, vous n’avez donc aucun moyen de modifier les données renvoyées. Pour l’authentification, CollectionAPI vous permet de définir un authToken à transmettre avec chaque requête. Cela ressemble plus à une clé d’API traditionnelle, car elle semble être codée en dur dans votre application et serait donc la même pour tous les utilisateurs.

Restivus, dans la mesure où il ne se limite pas au travail automatisé sur les collections, vous offre un contrôle complet sur vos points de terminaison. Il fournit maintenant toutes les fonctionnalités incluses dans l’API de collection. Il prend également en charge l’authentification des utilisateurs et les permissions de rôle, ce qui vous permet d’identifier l’utilisateur qui effectue la demande (et d’accéder facilement à cet utilisateur à partir de noeuds finaux authentifiés). Il fournit un sharepoint terminaison de connexion et de déconnexion pour vous aider. Je fournirai un exemple de code pour Restivus à la fin.

HTTP.publish:
D’après ce que j’ai compris, ceci est similaire à CollectionAPI en ce sens qu’il se limite à exposer les opérations CRUD de base sur les collections. Celui-ci est plus spécifiquement lié à la publication de Meteor et vous permet d’utiliser une fonction de publication pour gérer les requêtes GET. Je suis confus par la documentation, mais il est possible que l’authentification de base ne soit pas disponible. Je ne l’ai pas utilisé auparavant, mais je ne suis pas un grand fan de l’API, ce qui est un peu maladroit. Une fois que je publie plus largement, je vais essayer de le revoir. La même équipe a un autre paquet appelé HTTP.methods qui ne vous donne pas access aux fonctions de publication, mais a un api similaire à Restivus et, à ce moment-là, des fonctionnalités similaires.

Restivus est «meilleur» car il ne vous limite pas à utiliser vos fonctions de publication et permet donc un contrôle beaucoup plus fin sur vos points de terminaison. Si vous souhaitez simplement exposer vos fonctions de publication à une API externe, je vous recommande de restr avec HTTP.publish. Restivus dispose également d’une API plus simple et prend en charge la méthode HTTP PATCH (qu’aucun autre package ne semble reconnaître). Leur package HTTP.methods est assez similaire à Restivus, sauf qu’il manque de prise en charge de PATCH, et bien qu’il offre une authentification de base, je pense que vous ne pouvez que rendre tous les noeuds finaux authentifiés, ou aucun. Restivus vous permettra de contrôler cela au niveau du point final (pas uniquement par route). Les permissions de rôle (par exemple, utilisateur, administrateur) sur les ordinateurs d’extrémité sont également disponibles sur Restivus, mais je ne vois rien à ce sujet pour les méthodes HTTP.

Meteor Router:
Ceci a été déconseillé en faveur de Iron Router, voir ci-dessous.

Routeur de fer:
Iron Router est génial, mais il n’est pas spécifiquement conçu pour créer des API REST. Récemment, ils ont ajouté des fonctions correspondant aux méthodes HTTP (GET, POST, etc.), mais ils ne prennent en charge aucune forme d’authentification et vous n’avez access qu’aux objects de réponse et de requête de nœud de niveau inférieur. être obligé d’apprendre à travailler avec ceux-ci. Une fois que vous l’avez fait, vous constaterez qu’il y a un travail répétitif à effectuer sur chaque noeud final, comme la création de réponses avec les bons en-têtes et les bons codes de réponse. Vous devrez également vous soucier de la conformité à CORS si votre API est utilisée par le navigateur.

Restivus est en fait construit sur Iron Router et fournit une couche d’authentification sur les terminaux. Il élimine également la nécessité d’une interaction directe avec les objects requête et réponse du noeud, bien qu’ils soient toujours là au cas où nous aurions raté quelque chose. Donc, il utilise toute la puissance d’Iron Router avec une API de niveau supérieur pour votre plaisir de codage. Restivus est génial si vous utilisez déjà Iron Router, car il n’appenda aucune dépendance supplémentaire.

RestStop2:
J’utilisais en fait RestStop2 dans un projet sur lequel je travaille quand il est devenu obsolète en faveur de Iron Router. Ils avaient une documentation solide et une API que je préférais aux autres. Selon leur suggestion, j’ai construit un nouveau paquet sur Iron Router, qui est très inspiré par RestStop2. Restivus est maintenant approuvé sur la page RestStop2 GitHub, donc je pense qu’ils sont d’accord pour dire que c’est un remplacement valable.

Voici un petit extrait de code de la section Démarrage rapide des documents Restivus:

 if(Meteor.isServer) { Meteor.startup(function () { // Global configuration Restivus.configure({ useAuth: true, prettyJson: true }); // Generates: GET, POST on /api/users and GET, DELETE /api/users/:id for // Meteor.users collection Restivus.addCollection(Meteor.users, { excludedEndpoints: ['deleteAll', 'put'], routeOptions: { authRequired: true }, endpoints: { post: { authRequired: false }, delete: { roleRequired: 'admin' } } }); // Maps to: POST /api/articles/:id Restivus.addRoute('articles/:id', {authRequired: true}, { post: { roleRequired: ['author', 'admin'], action: function () { var article = Articles.findOne(this.urlParams.id); if (article) { return {status: "success", data: article}; } return { statusCode: 400, body: {status: "fail", message: "Unable to add article"} }; } } }); }); } 

Quiconque trébuche sur ce point (2013+), consultez le package intelligent Meteor Router , qui fournit des méthodes de routage côté serveur utiles pour créer des interfaces RESTful.

 Meteor.Router.add('/404', [404, "There's nothing here!"]); 

Pour vous aider dans vos recherches futures, consultez https://atmosphere.meteor.com – un référentiel de paquets intelligent. Et Meteorite est un outil CLI très pratique pour la gestion des versions et des packages.

La solution la plus élégante semble être HTTP.publish . Plutôt que d’inventer une nouvelle API comme les autres, elle ajoute simplement le protocole HTTP à l’interface de publish Meteor existante. Cela signifie, par exemple, que Meteor.allow et Meteor.deny fonctionnent automatiquement pour HTTP et DDP.

Exemple:

Si on lui remet une collection et une fonction de publication, HTTP.publish sera monté sur les URL et méthodes suivantes:

GET – / api / list – toutes les données publiées
POST – / api / list – Insérer un document dans la collection
GET – / api / list /: id – recherche un document publié
PUT – / api / list /: id – met à jour un document
DELETE – / api / list /: id – supprime un document

 myCollection = new Meteor.Collection('list'); // Add access points for `GET`, `POST`, `PUT`, `DELETE` HTTP.publish(myCollection, function(data) { // this.userId, this.query, this.params return myCollection.find({}); }); 

Il ne gère pas encore complètement l’authentification .

Oui, vous pouvez exposer les points de terminaison REST avec Meteor à l’aide de l’API privée. La fonctionnalité sera bientôt publiée , mais en attendant, voir Puis-je monter un autre gestionnaire de route via ____meteor_bootstrap____.app? .

Je sais que c’est un vieux sujet, mais au lieu d’utiliser un package externe, vous pouvez utiliser le package Meteor WebApp: https://docs.meteor.com/packages/webapp.html .

J’espère que cela aide!

Je pensais que je mettrais à jour la conversation pour 2014. Je n’ai toujours pas trouvé le moyen idéal pour implémenter les services REST dans Meteor et j’espère que quelqu’un pourra me diriger dans une autre direction pour enquêter. J’ai testé 3 projets et chacun a ses inconvénients:

meteor-router J’ai travaillé avec meteor-router mais la page github indique que ce ne sera que pour réparer les bugs et utiliser Iron Router sur tous les nouveaux projets. J’envisage toujours de l’utiliser car si cela fonctionne pour moi, les mises à niveau ne sont pas nécessaires, sauf pour un certain type d’authentification.

iron-router J’ai un exemple simple de service construit avec Iron Router, mais il semble prendre en charge les services REST encore moins que meteor-router et provoque le blocage du serveur si quelqu’un publie un sharepoint terminaison json invalide.

meteor-collectionapi Indique qu’une API REST pour les opérations CRUD de base est prise en charge, mais elle ne semble pas prendre en charge les requêtes autres que par id.