2010-08-18 3 views

Répondre

0

Sur la base de ma recherche Google des termes salut-REST et lo_REST, je ne pense pas que ce soit le choix aura beaucoup portant sur l'efficacité. Plutôt, il est plus d'une question de how "correct" you want to be.

Hi-REST est sans doute plus "correcte", mais je doute que l'utilisation de Hi-REST aura un effet significatif sur l'efficacité. La représentation des données que vous choisissez pour transporter les données (à savoir XML, XML binaire, JSON, etc.) aura un effet beaucoup plus important sur la performance des données.

+2

Je pense que la phrase «salut-repos/lo-rest» de Dare est plutôt datée. Aujourd'hui, je pense que cela signifie plus dans le sens de "soutenez-vous la contrainte hypermédia ou pas". À mon avis, si vous n'honorez pas la contrainte Hypermédia, ce n'est pas REST, mais c'est simplement RPC implémenté sur HTTP. Il partage beaucoup des avantages d'un système entièrement RESTful, mais il manque un peu d'entre eux. – mogsie

2

Pour que votre système soit RESTful, l'une des conditions est que le client ne sait pas quoi que ce soit avant sur la façon dont vos URIs sont structurés. Cela signifie que vous ne pouvez pas écrire du code qui construit des URI d'une manière particulière comme le font la plupart des clients de Twitter. La sagesse conventionnelle est que, pour qu'une ressource soit localisée, vous devez découvrir son URI dans un endroit différent.

Cependant, il y a des moments que vous avez affaire un nombre incalculable de ressources dans le système, et fournit des liens vers chacun est tout simplement stupide. Les données multidimensionnelles entrent dans cette catégorie. Dans ces cas, il est tout à fait correct de fournir au client des règles pour la construction d'URI, tant que ces règles sont découvertes au moment de l'exécution.

OpenSearch est absolument une solution RESTful à ce problème, et il est programmeur amical à cela. Beaucoup de l'utilisation de OpenSearch se limite aux résultats de la recherche HTML lisibles par l'homme ordinaire, mais en réalité, il peut être utilisé pour la machine purement lisibles (par exemple atome) résultats de recherche aussi:

<Url type="application/atom+xml" 
    template="...search/?q={searchTerms}"/> 

Ce modèle indique les clients que si vous J'aimerais une représentation atomique, vous pouvez aller ici. Mais comment cela correspond-il aux données multidimensionnelles? L'extensibilité d'OpenSearch entre en jeu ici. Le OpenSearch time extension décrit comment instruisent les clients à construire des URL qui représentent des recherches qui sont limités à un intervalle de temps spécifique (en supposant xmlns:time est correctement lié:

<Url type="application/atom+xml" 
    template="...search/?after={time:start}&amp;before={time:end}"/> 

Si un client voit ce modèle, il peut voir à partir du modèle que Pour étendre OpenSearch, je dois désigner un espace de nommage et certains éléments de cet espace de nommage pour signifier quelque chose de spécifique, qui devrait être publié quelque part afin que d'autres puissent accéder à la documentation et la mettre en œuvre. leurs propres serveurs et clients, disons que vous voulez regarder un client par nom de famille, le nom de famille est joli terme neric, mais pas assez universel pour être standardisé. Disons que je définir un espace de noms, se lient au préfixe name dans ma description OpenSearch, et exposer le modèle suivant:

<Url type="application/atom+xml" 
    template="...search?lastName={name:last}"/> 

Ce modèle indique à tout client qui comprend mon espace de noms name qu'il peut faire des recherches dernier nom par remplir le modèle.

Ce n'est pas encore multidimensionnelle, mais ajoutons une autre dimension; géographie. Heureusement, il y a une OpenSearch draft extension for geography qui permet la recherche dans un cadre de sélection ou d'un cercle:

<Url type="application/atom+xml" 
    template="...search/?latitude={geo:lat?}&amp; 
          longitude={geo:lon?}&amp; 
          metres={geo:radius?}"/> 

Je vais partager le modèle pour le rendre lisible.

Le modèle n'est toujours pas multidimensionnel, car il permet uniquement de rechercher dans une dimension (géospaciale). Alors, comment faites-vous des recherches multidimensionnelles? Vous fournissez un modèle qui montre comment faire des recherches multidimensionnelles, qui ont un sens à combiner:

E.g. voici un tha modèle me permet de trouver des personnes répondant à un nom donné dans une autre région (deux dimensions):

<Url type="application/atom+xml" 
    template="combo-find?customerLastName={name:last}&amp; 
          lat={geo:lat?}&amp; 
          lon={geo:lon?}&amp; 
          radius={geo:radius?}"/> 

Voici un modèle qui me permet de limiter les noms et géospatiale, avec une contrainte de temps (bien que l'extension temps OpenSearch ne dit rien sur ce que le temps que vous cherchez):

<Url type="application/atom+xml" 
    template="...search/?lastName={name:last}&amp; 
          lat={geo:lat?}&amp; 
          lon={geo:lon?}&amp; 
          r={geo:radius?}&amp; 
          after={time:start}&amp; 
          before={time:end}"/> 

Dans ces exemples, le client est libre de regarder dans le modèle URI pour savoir quels sont les paramètres du modèle URI doivent être rempli. Ainsi, le client saura quelles sont les dimensions prises en charge par chaque modèle d'URI et pourra déterminer quel URI convient le mieux à tout moment.

La RESTfulness de tout cela est parce que toutes les contraintes REST sont honorées; il est sans état, hypermédia est le moteur, il est en couches, etc. OpenSearch est juste un autre format hypermédia, un très bon à cela!

Questions connexes