2010-12-09 6 views
3

Comme nous le savons tous, un service Web ReST ne peut pas maintenir l'état - c'est un problème pour moi maintenant quand je considère de grandes transactions de base de données et je me demande si vous pouvez aider.REST et grandes requêtes de base de données

Mon service Web ReST a un rôle majeur: effectuer des opérations CRUD sur une base de données. Le problème est que je dois interroger une table avec des milliers de lignes et la renvoyer au client en XML - ce n'est pas bon. Il est très inefficace de continuer à demander des milliers d'enregistrements MAIS vous ne pouvez pas effectuer de transactions partielles (c'est-à-dire en utilisant le mot clé ROWNUM dans Oracle) avec un service Web REST. Alors, comment obtenez-vous autour de ça?

Une façon possible d'obtenir des enregistrements à la fois d'une table 100 serait:

http://mywebservice/employees/0/100

J'occupe l'état pour la dernière demande présentée soit 100

la demande suivante serait:

http://mywebservice/employees/101/200

et ainsi de suite. Mais est-ce strictement reposant?

+1

En quoi ORACLE est-il spécifique? Le client doit conserver l'état et doit envoyer des données telles que le décalage, la commande et le nombre de lignes qu'il souhaite renvoyer. Si le client veut toutes les données, vous ne pouvez rien faire à ce sujet. Donc, le client devrait faire tout le travail. Ou est-ce que quelque chose me manque? Pouvez-vous poster un échantillon exact? – Christian

+2

Quel est le problème? Que la table est grande? Ou que le sous-ensemble retourné est grand? Ou que vous ne pouvez pas retourner des sous-ensembles de données? – Ronnis

+0

@Waxolunist - Ce n'est pas vraiment spécifique à Oracle Je l'ai juste utilisé comme exemple. Je peux convenir que le client devrait faire tout le travail et tenir l'état et former une URL en conséquence - mais il y a un contre-argument que le client ne devrait pas devoir connaître une tonne d'information pour former une URL valide - il devrait être sinon, je pense que vous marchez dans un territoire non reposant. – Vidar

Répondre

1

Vous avez mentionné CRUD mais votre exemple ressemble à une action en lecture seule. Pourquoi n'introduisez-vous pas la pagination?

# items 0 to 99 
GET /employees?page=0&size=100 
# items 100 to 199 
GET /employees?page=1&size=100 

Il n'est pas clair quel état vous voulez dire dans votre exemple. Parler de repos sur HTTP api, oui HTTP est lui-même un protocole sans état, mais le système global a sûrement un état, qui peut changer au fil du temps (par exemple, lorsque vous faites une action d'écriture à la POST). Peut-être pouvez-vous donner des exemples d'actions d'écriture (vous avez mentionné les transactions) que vous essayez d'exposer via Restful API?

+0

Je vois que vous mettez/à des plages comme des éléments de chemin (qui est un concept de pagination). Les paramètres (dans ce cas la pagination) ne parlent pas contre Restful URL over HTTP.Le fait de coder ceci à l'intérieur d'un chemin ou d'un paramètre est souvent une question de goût et de normes/bon sens. Mon pouce de règle est, si cela ressemble à un répertoire (comme une sous-ressource), faites-en un élément path, sinon faites le paramètre. Je pense que 'page = 1 & size = 100' correspond plus à des paramètres et est plus intuitif que/0/99. –

Questions connexes