2014-10-20 5 views
5

Ich möchte JSON-Ressourcen rekursiv von einem REST-fähigen HTTP-Endpunkt herunterladen und diese in einer lokalen Verzeichnisstruktur speichern. Dabei werden Links zu verwandten Ressourcen in Form von JSON-Strings mit HTTP-URLs verwendet. Wget scheint ein wahrscheinliches Werkzeug für den Job zu sein, obwohl sein rekursiver Download anscheinend auf HTML-Hyperlinks und CSS-url() - Referenzen beschränkt ist.Ressourcen rekursiv vom RESTful-Webdienst herunterladen

Die Ressourcen in Frage sind Swagger Dokumentationsdateien ähnlich wie this one, obwohl in meinen Fällen alle URLs absolut sind. Das Swagger-Schema ist ziemlich kompliziert, aber es wäre ausreichend, einer beliebigen Zeichenfolge zu folgen, die wie eine absolute HTTP (S) -URL aussieht. Noch besser wäre es, absoluten oder relativen Pfaden zu folgen, die in 'Pfad'-Eigenschaften angegeben sind.

Kann jemand einen allgemeinen rekursiven Crawler vorschlagen, der tun würde, was ich hier will, oder eine leichte Art des Scripts wget oder ähnliches, um es zu erreichen?

+0

Wenn jemand neugierig ist, versuche ich dies zu tun, um Änderungen unserer In-Entwicklung API im Laufe der Zeit zu verfolgen - vor einer Veröffentlichung konnten wir die aktuelle Dokumentation mit einem Schnappschuss von der vorherigen Version zu vergleichen. – yjo

+0

Ich kann Ihnen nicht vorschlagen, was Sie fragen, aber für allgemeine Informationen ist Swagger 2.0 im Allgemeinen eine Einzelseiten-Deklaration und nicht mehrseitig (es kann * bei Bedarf mehrseitig sein), so dass Diffs einfacher wären . – Ron

+0

@webron - klingt wie das wäre eine Verbesserung! Leider werden unsere Swagger-Dokumente semi-automatisch generiert (mit [swagger-springmvc] (https://github.com/martypitt/swagger-springmvc)) und ich denke nicht, dass Swagger v2.0 eine Option ist. – yjo

Antwort

4

landete ich ein Shell-Skript zu schreiben, das Problem zu lösen:

API_ROOT_URL="http://petstore.swagger.wordnik.com/api/api-docs" 
OUT_DIR=`pwd` 

function download_json { 
    echo "Downloading $1 to $OUT_DIR$2.json" 
    curl -sS $1 | jq . > $OUT_DIR$2.json 
} 

download_json $API_ROOT_URL /api-index 

jq -r .apis[].path $OUT_DIR/api-index.json | while read -r API_PATH; do 
    API_PATH=${API_PATH#$API_ROOT_URL} 
    download_json $API_ROOT_URL$API_PATH $API_PATH 
done 

Diese jq verwendet die API Pfade aus dem Index-Datei zu extrahieren, und auch die JSON ziemlich zu drucken, wie sie heruntergeladen wird. Als webron erwähnt, wird dies wahrscheinlich nur für Leute interessant sein, die immer noch das 1.x Swagger-Schema verwenden, obwohl ich sehen kann, dass ich dieses Skript für andere Probleme in der Zukunft anpassen werde.

Ein Problem, das ich damit für Swagger gefunden habe, ist, dass die Reihenfolge der Einträge in unseren API-Dokumenten anscheinend nicht stabil ist. Wenn Sie das Skript mehrmals hintereinander mit unseren API-Dokumenten (generiert von swagger-springmvc) ausführen, führt dies zu geringfügigen Änderungen an den Eigenschaftsbestellungen. Dies kann teilweise durch Sortieren der Eigenschaftsschlüssel der JSON-Objekte mit der Option --sort-keys von jq behoben werden, aber dies deckt nicht alle Fälle ab, z. Die required -Eigenschaft eines Modellschemas ist ein einfaches Array von String-Eigenschaftsnamen.

Verwandte Themen