Mettre en œuvre une architecture de service universel au Web en utilisant Ajax

Cet article se concentre sur le renforcement des AWeb architecture de service. Dans l'article précédent, vous avez appris comment créer une architecture d'ensemble qui comprenait les fondations de la façon de construire et de son service AWeb URL appropriées. Toutefois, il n'a pas expliqué les détails de ce service AWeb fait et pourquoi le service AWeb devrait faire ce qu'elle fait. Cet article décrit les lignes directrices sur la façon de développer un Representational State Transfer (REST) basé sur un service Web. Plus précisément, il couvre les points suivants:

• Structurer le service AWeb pour résoudre une tâche spécifique

• La combinaison de services Web pour filtrer et modifier des données

• La combinaison de services Web pour créer des mashupsProblèmeRegardons un problème au sein d'un stock-application de négociation comme un exemple d'un problème dans la construction de services Web. Le problème est que de nombreux clients ont besoin d'accéder en temps réel, historique et informations de commande. AWeb Ajout de fin de service avant, vous permet d'utiliser le serveur socket middleware sans faire de modifications. Bien qu'il mai sembler comme un gaspillage de ressources pour ajouter une interface à un service dans un contexte d'ensemble du service Web, il est logique ici. Cet article explore les raisons.

  

Solution Partie 1

La mise en œuvre de la solution consiste à prendre l'une des technologies socket déjà existants et d'utiliser cette technologie pour développer le service AWeb. À titre d'illustration, cet article utilise une seule technologie Java. Vous pourriez choisir. NET ou C + + de la technologie actuelle n'est pas important, parce que les exposés de service Web peut être consommé par toute technologie qui est le service Web-Aware. L'approche initiale à la construction du service Web pour définir les opérations thegeneral puis mettre en oeuvre ces opérations générales en utilisant des technologies.

De l'avis de haut niveau de l'architecture de négociation, un type classe appelée TradeServlet qui implémente une servlet Java fournit le service Web. Pour ceux qui n'est pas versé dans les technologies Java, une servlet Java est une façon de mettre en place un gestionnaire HTTP. TradeServlet exécute les demandes historiques, véritables demandes de données en temps, et les demandes de commande en utilisant une interface nommée iTrader. Du point de vue de programmation, en utilisant une interface est la bonne approche, car elle vous permet d'utiliser le modèle Bridge. Le modèle Bridge vous permet de découpler l'intention de négocier à partir de la mise en œuvre des activités de négoce. De l'avis de haut niveau de l'architecture des services Web, le ProviderTrader1 type implémente l'appel de la fonctionnalité appropriée via le socket layer. La théorie du modèle Bridge vous permet d'utiliser un appel socket aujourd'hui comme un pis-aller, mais demain, remplacer ProviderTrader1 avec une nouvelle implémentation (comme le remplacement de l'intergiciel avec le service Web) sans avoir à changer la mise en œuvre de TradeServlet ou le iTrader interface.

La classe ProviderTrader1

implémente l'interface iTrader et fournit un pont entre l'opérateur-système neutre pour le socket système commercial fondé. Un autre fournisseur pourrait être utilisé pour accéder à une base de données héritées. Peu importe le nombre de fournisseurs, le service Web interagit avec l'opérateur-système neutre. Et le trader-sous-système neutre interagit avec le socket système commercial fondé. En théorie, cette approche est son, mais il souffre d'être trop complexe. Le problème de cette approche est une question de focus. Dans l'exemple du sous-système professionnel, l'accent est le sous-système et la couche de service Web est un add-on à la sous-système de commerçant. En théorie, le service Web add-on n'est même pas nécessaire, parce que le sous-système opérateur gère tout. Dans le contexte d'une demande de service Web Ajax, c'est la mauvaise approche parce que l'accent est le service Web, et elle ne devrait pas être un add-on.

Solution Partie 2

La solution au sous-système opérateur est de définir ni ne mettre en œuvre un opérateur sous-système neutre en utilisant une technologie spécifique. Le sous-système opérateur est converti en une série de services Web que vous pouvez assembler en un sous-système. Service AWeb sous-système de trader exige encore une interface, mais l'interface est définie au niveau de service Web HTTP. Sur le plan architectural, les implémentations iTrader transforment en services Web. L'architecture s'appuie sur la réutilisation des implémentations déjà existantes de ProviderTrader1 et ProviderTrader2 directement de la classe TradeServlet. Chaque application fournit un ensemble de méthodes, propriétés et ensembles de résultats que l'opérateur-système neutre définit. En utilisant le service AWeb, les méthodes, les propriétés et les jeux de résultats sont convertis en quelque chose qui est un service Web compatible. Puis, à un niveau supérieur, une autre technologie assemble les services Web dans un sous-commerçant.

Mise en œuvre du Trader-Universal Service WebLe service commercial Web est un exemple de ce à quoi s'attendre lorsqu'ils mettent en œuvre une solution complète de service Web. Cet article traite de ces pièces restantes:

• Définir les URL

• Identifier les formats qui peuvent être envoyés et reçus

• Comment appuyer les URL relatives

Définir les URL pour les applications TraderContinuons avec l'évolution de l'opérateur de service Web et un aperçu des pièces importantes, à savoir les URL et les formats de données pris en charge. L'application commerçant expose les URL de base suivantes:

 

• / services / contrôleur

• / services / en temps réel

• / services / commandes

• / services/orders/trader123/order345

• / services / historiques

services / / contrôleur est l'URL de base utilisée pour gérer le moteur sur le côté serveur. Le contrôleur Web vous permet de réinitialiser le code derrière le service Web manuellement. Par exemple, dans le cas de l'application commerçant, / services / contrôleur devrait relier l'application de service Web pour le socket qui fournit l'interface de négociation. Vous pouvez utiliser l'URL / services / controller / start pour lancer le code du serveur, et vous pourriez utiliser l'URL / services / controller / stop pour arrêter le code du serveur. Toutefois, cette approche ne serait pas utilisable, car il semblerait que les identificateurs de démarrage et d'arrêt sont des ressources, dont ils ne sont pas. Comparez-le à un commutateur. Un interrupteur de la lumière est une ressource unique qui a deux états: on et off. Il ne pas sont deux ressources, un pour chaque état. Vous utilisez des paramètres de requête pour démarrer et arrêter le code serveur. Pour lancer le code du serveur, vous exécutez le verbe POST sur l'URL / services / contrôleur avec l'interface d'infographie (CGI) = début de paramètres d'action. Pour arrêter le code du serveur, l'URL reste la même, tout comme le verbe, mais le changement des paramètres CGI à l'action = arrêt. Le verbe POST est appropriée, parce que tu es l'exécution de certains processus côté serveur, et ce que le processus devrait faire dépend de données envoyées. Appeler le verbe GET sur l'URL / services / contrôleur renvoie l'état du code serveur.

Si vous souhaitez contrôler les multiples pièces de code serveur dans votre application, puis créer des URL des enfants, telles que les suivantes: / services/controller/code1 et / services/controller/code2. Les lignes directrices pour le démarrage, d'arrêt, et l'extraction de l'état des morceaux de code serveur individuels demeurent les mêmes. Souvent, des morceaux de code côté serveur nécessitent des directives de configuration, telles que l'emplacement du répertoire de base, combien de fils à démarrer, et ainsi de suite. Ces directives de configuration sont généralement stockés dans un fichier de configuration. Vous devriez être en mesure de préciser ces directives lors du démarrage du serveur de code ou s'arrête. Par exemple, si vous voulez spécifier un nombre de threads, alors vous pourriez utiliser l'action de paramètres CGI = & start = 12 fils au pouce pour le démarrage du code du serveur.

Si vous avez la possibilité de définir des directives de configuration, alors ils peuvent être consultées et récupérées lorsque le statut du serveur est demandé. Si vous souhaitez interroger la valeur individuelle d'une variable de serveur, vous pouvez filtrer en utilisant des paramètres de requête comme / services / contrôleur? Status = fils au pouce + temps de disponibilité. Vous utilisez l'URL de base / services / en temps réel pour gérer le stock en temps réel données téléscripteur. Par exemple, si vous êtes intéressé par le ticker GM, vous devriez utiliser les URL / services / temps réel / GM pour récupérer les informations en temps réel. Il semblerait que cette URL de base est la plus simple, mais la simplicité est trompeuse. Par exemple, si les utilisateurs exécutent GET sur l'URL / services / en temps réel, ce qui est retourné? Il s'agit d'une question délicate, parce que vous approchez de la limite d'un morceau de logiciel. Du point de vue théorique, appelant Obtenez des résultats dans le retour des données en temps réel pour tous les téléscripteurs. Cela sonne bien en théorie, mais c'est complètement irréaliste. Il ya littéralement des milliers d'actions sur des échanges multiples. Obtenir tous les bannières dans une demande en temps réel en utilisant une requête GET est pratiquement irréalisable.

Ceci est un exemple d'une URL où la théorie et la pratique sont en conflit. La solution ne supporte pas l'URL racine comme une référence aux données en temps réel. La racine d'URL est utilisée pour renvoyer une liste de tous les liens disponibles en temps réel. La racine Web n'est pas utilisé pour indiquer ce que l'information en temps réel parce que cela ne nécessite pas la suite des milliers de réglettes. L'URL racine reviendra liens où vous pouvez récupérer des données en temps réel. Cela pourrait signifier le retour des liens vers des milliers de Tickers stock. Vous pouvez également utiliser l'URL racine pour retourner à la fois le lien vers le boursier et une description des entreprises abrégée. Cela contribuerait à la construction d'un moteur de recherche, comme la plupart des gens ne savent pas le ticker, mais ne connaissez le nom de la corporation. Déléguer l'URL racine à des URL individuelles pose un problème en ce que le service Web peut pas gérer les flux en temps-réel pour toutes Tickers stock sur tous les échanges.

Pour le dire simplement, vous ne pouvez pas suivre tous les stocks sur un seul ordinateur. Suivi de l'ensemble des stocks nécessite d'énormes quantités de puissance que cet article ne vais pas détailler. La seule solution est d'utiliser une piste, si posées solution. Dans une track-si-a demandé solution, pas de stocks sont suivis initialement pour des données en temps réel. Données en temps réel seront suivis que si un serveur HTTP GET est exécutée sur un titre en particulier. Un HTTP POST ou DELETE ou PUT ne fait pas de sens sur le flux en temps réel, car un flux en temps réel comprend des données qui va du serveur vers le client. Le serveur n'est pas intéressée par toute information du client autre que celle qui ticker pour générer des données en temps réel pour. Si un autre verbe que GET est exécutée, le serveur va générer une erreur HTTP 500.

services / / commandes spécifie l'URL racine pour le traitement des commandes. Dans le contexte des stocks, traitement des commandes fait usage de tous les verbes HTTP. Vous utilisez HTTP POST pour valider une commande, HTTP PUT pour modifier une commande, HTTP GET pour récupérer le statut d'une commande, et HTTP DELETE pour supprimer une commande.

Chaque commande sera représenté comme un identifiant unique, par exemple, / services/orders/1232445. L'identifiant unique n'a pas à être numérique, mais il peut être alphanumérique ou même amore compliquée Globally Unique Identifier (GUID). L'URL racine peut être l'hôte de plusieurs ordres, ce qui pourrait signifier littéralement des millions de commandes. Pour l'URL commande, il est important que vous avez la possibilité de commandes de filtrage selon un statut spécifique. Vous pourriez être tenté d'organiser des commandes en fonction d'une date, mais je conseille d'éviter cela. Chaque fois que vous créez une racine Web, les données de la collection devrait être accessible dans sa forme naturelle. Dans une application de blog, il est naturel d'organiser par date. Toutefois, l'ordre naturel d'une demande de stock n'est pas par jour, mais plutôt par ordre d'identification. Ainsi, les commandes root URL sera littéralement des millions d'ordres qui lui sont associés. Si une application qui se passe à demander toutes les commandes, le serveur aura besoin de donner à tous de ces ordres. Dans le cas d'une base de données SQL, si une table a des millions et des millions d'enregistrements, et que quelqu'un exécute la requête SELECT * FROM table, la base de données ne sera pas demander: «Es-tu sûr?" La base de données ira de l'avant et sélectionnez tous les dossiers, même si elle pourrait ne pas être efficace.

Vous pouvez créer des filtres pour optimiser l'accès à des ordres. Par exemple, si vous voulez trouver toutes les commandes en 2006, vous pouvez exécuter l'URL / services / commandes /? Année = 2006. Vous pouvez également convertir les paramètres de requête dans une vue d'URL, tel que / services/orders/2006. Si vous utilisez le paramètre de requête ou de la démarche de visualisation URL dépend de votre préférence. Il ya un filtre qui ne se révèle problématique, et elle se rapporte aux utilisateurs. Dans tout système de commande, vous avez plusieurs utilisateurs. Un stock-application de négociation n'est pas différente. Ce qui fait une demande d'ordonnance d'actions de négociation plus compliqué, c'est que la commande n'est pas remplies automatiquement. Il ne pourrait pas toujours être remplies, et il pourrait même être annulée. Si un système d'ordre n'a pas la possibilité de filtrer par opérateur, vous pourriez potentiellement arriver à une situation où un opérateur peut ouvrir une position et un autre opérateur ferme une position.

En théorie, vous pouvez acheter et vendre une action future dans le même temps (appelé Lavage de négociation). En achetant et en vendant en même temps, vous êtes gagnant ni perdant, ni, du moins autre que vos frais de courtage. Cette technique d'achat et de vente au même moment à travers deux différents courtiers est illégale, car elle donne l'impression qu'il ya comme une action sur une position alors qu'en réalité il n'y est pas. Par conséquent, les commerçants sont liés à leurs ordres, et les ordres sont liés à leurs opérateurs. Un raffinement logique des ordres URL serait / services / commandes / [opérateur]. Cette URL raffinée illustre le fait que parfois vous devez créer des URL qui répondent à d'autres besoins, comme, dans ce cas, les besoins du service juridique.

Avec ce raffinement de l'URL, ne l'URL racine / services / ordres deviennent obsolètes? Tout, y compris les paramètres des requêtes et les URL de vue, s'applique toujours. La différence est que l'URL pour accéder aux informations de commande contient l'identifiant unique du commerçant. En supposant que vous allez utiliser le raffinement à l'URL, let's go par ce que les verbes individuels feront aux niveaux URL différente. Au niveau de la racine Web (/ services / ordres), que le HTTP GET s'applique. A ce niveau, vous ne pouvez filtrer les commandes que vous voulez voir. Vous ne pouvez pas poster, parce que la racine Web est manquant ID de l'opérateur, et vous ne pouvez pas mettre, parce que la racine Web est une URL de collecte. Enfin, vous pouvez pas supprimer, parce que cela entraînerait la suppression de tous les ordres et les commerçants.

Un niveau plus bas, vous auriez l'URL racine pour un opérateur particulier (/ services / commandes / trader-ABC). À l'adresse URL racine pour un opérateur particulier, seul le GET et HTTP POST sont applicables. Vous voulez utiliser GET pour récupérer et éventuellement filtrer tous les métiers que le professionnel a fait. Par exemple, vous pourriez filtre pour plusieurs opérations effectuées dans un mois donné, l'année, ou le jour. Vous pouvez utiliser les URL / services/orders/trader-abc/2006 ou / services / commandes / trader-ABC? Année = 2006. Le verbe HTTP POST est applicable, car il permet aux utilisateurs de valider une commande sans un ordre d'identification. La soumission de la commande renvoie l'URL où vous pouvez récupérer le statut d'une commande. Si un poste à l'URL HTTP / services / commandes / trader-ABC est envoyé, l'URL / services / commandes / trader-abc/123456 pourraient être retournés.

Appliquant le DELETE verbe à la racine Web est un peu délicate en raison de ce que signifie le verbe. Si vous étiez à appliquer le verbe DELETE, il supprimerait toutes les commandes à l'adresse URL racine. En pratique, cela est très mal conseillé. L'une des raisons pour appuyer le verbe DELETE est d'être en mesure de supprimer des éléments de manière sélective via un paramètre de requête qui agit comme un filtre. À titre d'exemple, pour supprimer toutes les commandes dans une année, vous pouvez utiliser l'URL / services / commandes / trader-ABC? Année = 2006. Avis de l'URL utilisée pour supprimer de manière sélective est le même que l'URL utilisée pour sélectionner de manière sélective. La différence est le verbe (DELETE vs GET). Elle est un phénomène fréquent que les URL seront match, mais présentent des comportements différents en fonction du verbe. Dans le cadre du système commercial, les ordres de suppression aurait des restrictions. Si un ordre est exécuté, vous ne pouvez pas supprimer la commande. Le verbe PUT restante est pour la plupart pas applicable au niveau de l'URL racine. Vous utilisez le verbe PUT pour envoyer une représentation complète de la ressource sur le serveur. Dans le cas de la racine d'URL, il s'agit de transmettre tous les ordres au serveur. Le problème avec l'envoi des ordres au serveur est que vous ne pouvez pas envoyer des ordres complets. La commande est complète, mais l'identifiant de commande (calculée au moment où une commande est affiché) est manquant. Ainsi, vous ne pouvez pas utiliser PUT pour envoyer un ordre nouveau au serveur.

Une autre raison d'utiliser PUT serait de modifier un ordre existant. En général, cela est une utilisation légitime, mais il est incorrect dans le contexte du système commercial. Qu'advient-il si vous tentez de modifier une ordonnance qui est en cours d'exécution? Il n'ya pas de recours simple, et donc dans le cadre du système de commande, en modifiant une ordonnance peuvent causer plus de problèmes que de solutions. La solution de négociation appropriée consiste à supprimer la commande et de créer un nouveau. / Services/orders/trader123/order345 représente un référencement URL de la ressource de commande. En général, vous pouvez appliquer tous les verbes HTTP, mais il vous faudra définir des limites pour tenir compte de processus d'affaires. Dans le cas de l'application commerçant, vous ne pourriez pas utiliser le verbe PUT sur un nouvel ordre, parce que la demande d'ordonnance ne vous permet pas de déterminer un ordre d'identification à l'avance. Vous aussi vous ne pouvez pas placer une commande existante, car cela signifierait la modification de l'ordonnance, et dans le contexte d'un système commercial, une commande peut exécuter une ou l'autre ou être annulé. Vous pouvez demander et utiliser le verbe SUPPR pour définir une annulation de la commande. UN POSTE d'une ordonnance n'aurait de sens que si le poste représente un ordre qui est une annulation. Un EEG serait utilisé pour récupérer l'état de l'exécution d'une ordonnance.

/ services / historique représente une URL racine utilisé pour récupérer les données historiques du middleware. Obtenir un flux historique est unique en ce qu'il n'ya qu'un seul verbe applicables à savoir, obtenir. Le mot historique implique quelque chose qui a déjà passé, et vous ne pouvez pas réécrire l'histoire. Réécrire l'histoire pourrait se produire si vous tentez d'utiliser le verbe PUT ou DELETE. UN POSTE serait applicable si vous utilisez l'auto-test pour créer une requête sophistiqué. Par exemple, vous pouvez utiliser un post de numériser et de filtrer les données historiques selon un ensemble de critères. Pour rendre le service historique Web aussi efficace que possible, vous devez la capacité de définir des requêtes complexes. Repos n'est pas équipé pour ça, parce que reste reposant sur le protocole HTTP. Cela ne veut pas dire que vous ne pouvez pas utiliser REST pour interroger les données, mais que vous devez écrire la plomberie. Par exemple, disons que vous voulez trouver tous les stocks qui faisaient le commerce dans un domaine particulier pendant cinq jours sur 10. Vous auriez besoin de coder ce genre de requête dans la forme d'un appel REST que les délégués à une requête relationnelle, supposant que les données sont stockées dans une base de données relationnelle. Une autre approche consiste à utiliser une base de données XML, mais vous aurez besoin de décider de cette avance. L'avantage de stocker vos données dans une base de données XML est que vous pouvez facilement tracer les requêtes HTTP à la hiérarchie XML. Utilisation de XML Query Language (XQL) et XPath sur la base de données XML, vous pouvez facilement exécuter des requêtes complexes sans avoir à écrire la plomberie. Vous devez vous rappeler que la puissance d'un service historique Web réside dans la façon de mettre en oeuvre les requêtes.

Quel format de données à envoyer?Jusqu'à présent, l'ensemble des services Web exemple ont été expliqués en termes d'URL, mais pas en termes de contenu qui est acceptée et produite. Dans le cas de l'application blogging introduit à l'article 4, le service Web en utilisant des données générées par Atom le type MIME application / atom + xml. Quand le repos services de la construction Web, le type MIME est importante, car elle détermine la façon dont les données sont reçues et envoyées. Dans le cas de l'application de blogs, si l'URL Atom est appelé, il va générer un flux XML. En théorie, la stratégie de développement REST est de créer le service AWeb qui est technologyneutral et générera le bon contenu pour la requête droite.

un article présenté par Sonja Lande


Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite.
Important: Cet article «Mettre en œuvre une architecture de service universel au Web en utilisant Ajax" a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.


Online: 509 users browsing the articles directory