Je suis intéressé dans le fait d'exposer directement le REPOS de l'interface pour les collections de documents JSON (pensez à CouchDB ou Persévérer). Le problème, je suis en cours d'exécution dans est comment gérer l' GET
opération sur la racine collection si la collection est importante.
Comme exemple de faire semblant, je suis d'exposer StackOverflow de l' Questions
tableau où chaque ligne est exposée dans un document (pas qu'il y ait nécessairement est un tableau, un exemple concret d'une importante collection de "documents"). La collection sera disponible à l' /db/questions
avec l'habitude CRUD api GET /db/questions/XXX
, PUT /db/questions/XXX
, POST /db/questions
est en jeu. La méthode standard pour obtenir l'intégralité de la collection est-à - GET /db/questions
mais si naïvement décharges chaque ligne comme un objet JSON, vous obtiendrez un groupe assez nombreux de téléchargement et beaucoup de travail de la part du serveur.
La solution est, bien sûr, d'échange. Dojo a résolu ce problème dans son JsonRestStore via un astucieux RFC2616-conforme à l'extension de l'aide de l' Range
- tête avec un éventail personnalisé de l'unité items
. Le résultat est un 206 Partial Content
qui retourne uniquement la plage requise. L'avantage de cette approche sur un paramètre de requête, c'est qu'il quitte la chaîne de requête pour...les requêtes (par exemple, GET /db/questions/?score>200
ou somesuch, et oui ce serait codé %3E
).
Cette approche couvre complètement le comportement que je veux. Le problème est que la RFC 2616 précise que sur une 206 de réponse (l'emphase est mienne):
La demande DOIT inclure une Gamme de champ d'en-tête (section 14.35) indiquant la plage souhaitée, et PEUT-être une Si-Gamme champ d'en-tête (section 14.27) pour en faire la demande conditionnelle.
Cela a un sens dans le contexte de l'utilisation standard de l'en-tête mais c'est un problème parce que j'aimerais que la 206 de réponse par défaut pour gérer les naïfs clients/personnes au hasard de l'exploration.
J'ai dépassé les RFC en détail à la recherche d'une solution, mais ont été malheureux avec mes solutions, et j'aimerais DONC prendre le problème.
Les idées que j'ai eu:
-
De retour
200
avec unContent-Range
- tête! - Je ne pense pas que c'est mal, mais je préfère si un plus évident, voyant que la réponse n'est que Partielle du Contenu. -
De retour
400 Range Required
- Il n'y a pas un spécial 400 code de réponse pour les en-têtes, de sorte que l'erreur par défaut doit être utilisé et lire par la main. Cela rend également l'exploration via un navigateur web (ou un autre client comme Resty) plus difficile. - L'utilisation d'un paramètre de requête - L'approche standard, mais je suis l'espoir d'autoriser les requêtes à la Persévérer et présente des coupes dans la requête de l'espace de noms.
-
Juste retour
206
! - Je pense que la plupart des clients de ne pas paniquer, mais je préfère ne pas aller à l'encontre d'un must dans la RFC -
Étendre la spec! De retour
266 Partial Content
- se Comporte exactement comme la 206 mais est en réponse à une demande qui ne DOIT PAS contenir de l'Range
- tête. Je figure que 266 est suffisamment élevé pour que je ne devrais pas courir dans la collision de problèmes et qu'il fait sens pour moi, mais je ne suis pas clair si cela est considéré comme un tabou ou pas.
J'avais pense que c'est un problème assez courant et j'aimerais voir ce fait dans une sorte de facto de la mode donc je ou quelqu'un d'autre n'est pas de réinventer la roue.
Quelle est la meilleure façon d'exposer une collection complète via HTTP, lorsque la collection est importante?