2014-10-20 14 views
5

Vorrei scaricare ricorsivamente risorse JSON da un endpoint HTTP RESTful e archiviarle in una struttura di directory locale, seguendo i collegamenti alle risorse correlate sotto forma di stringhe JSON contenenti URL HTTP. Wget sembrerebbe essere uno strumento probabile per il lavoro, sebbene il suo download ricorsivo sia apparentemente limitato ai collegamenti ipertestuali HTML e ai riferimenti dell'URL CSS().Ricorsivamente risorse dal servizio web RESTful

Le risorse in questione sono file di documentazione Swagger simili a this one, sebbene nei miei casi tutti gli URL siano assoluti. Lo schema di Swagger è abbastanza complicato, ma sarebbe sufficiente seguire qualsiasi stringa che assomigli ad un URL HTTP (S) assoluto. Ancora meglio sarebbe seguire percorsi assoluti o relativi specificati nelle proprietà 'percorso'.

Qualcuno può suggerire un crawler ricorsivo per scopi generici che farebbe ciò che voglio qui, o un modo leggero di script wget o simile per raggiungerlo?

+0

Se qualcuno è curioso, sto cercando di farlo per tenere traccia dei cambiamenti delle nostre API in fase di sviluppo nel tempo - prima di un rilascio saremmo in grado di diffare la documentazione corrente con uno snapshot della versione precedente. – yjo

+0

Non è possibile suggerire un modo per fare ciò che si chiede, ma per informazioni generali, Swagger 2.0 è generalmente una dichiarazione a pagina singola anziché a più pagine (può * essere * essere multi-pagina se necessario) quindi le differenze sarebbero più facili allora . – Ron

+0

@webron - sembra che sarebbe un miglioramento! Sfortunatamente i nostri swagger doc sono generati in modo semi-automatico (con [swagger-springmvc] (https://github.com/martypitt/swagger-springmvc)) e non penso che l'output di Swagger v2.0 sia un'opzione. – yjo

risposta

4

ho finito per scrivere uno script di shell per risolvere il problema:

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 

Questo utilizza jq per estrarre i percorsi API dal file di indice, e anche per stampare abbastanza il JSON in quanto viene scaricato. Come dice webron questo probabilmente interesserà solo le persone che usano ancora lo schema 1.x Swagger, anche se posso vedere me stesso adattare questo script per altri problemi in futuro.

Un problema che ho riscontrato con Swagger è che l'ordine delle voci nei nostri documenti API non è apparentemente stabile. L'esecuzione dello script più volte di seguito rispetto ai nostri documenti API (generati da swagger-springmvc) comporta modifiche minori agli ordini di proprietà. Questo può essere parzialmente risolto ordinando le chiavi di proprietà degli oggetti JSON con l'opzione --sort-keys di jq, ma ciò non copre tutti i casi, ad es. la proprietà required di uno schema modello che è una semplice matrice di nomi di proprietà stringa.

Problemi correlati