从RESTful Web服务递归下载资源

时间:2014-10-20 10:21:31

标签: json rest wget swagger

我希望以递归方式从RESTful HTTP端点下载JSON资源,并将这些资源存储在本地目录结构中,并以包含HTTP URL的JSON字符串形式链接到相关资源。虽然它的递归下载显然仅限于HTML超链接和CSS url()引用,但Wget似乎是这项工作的可能工具。

有问题的资源是与Swagger类似的this one文档文件,但在我的情况下,所有网址都是绝对的。 Swagger架构相当复杂,但是遵循任何看起来像绝对HTTP(S)URL的字符串就足够了。更好的方法是遵循“路径”中指定的绝对路径或相对路径。属性。

任何人都可以建议一个通用的递归爬虫,它可以做我想要的东西,或者一种轻量级的脚本wget或者类似的方法来实现它吗?

1 个答案:

答案 0 :(得分:4)

我最终编写了一个shell脚本来解决问题:

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

这使用jq从索引文件中提取API路径,并在下载时非常打印JSON。正如webron提到的那样,对于仍然使用1.x Swagger模式的人来说,这可能只会引起人们的兴趣,尽管我可以看到自己在将来修改此脚本以解决其他问题。

我发现Swagger的一个问题是我们的API文档中的条目顺序显然不稳定。针对我们的API文档(由swagger-springmvc生成)连续多次运行脚本会导致对属性订单进行微小更改。这可以通过使用jq的--sort-keys选项对JSON对象的属性键进行排序来部分修复,但这并不包括所有情况,例如模型模式的required属性,它是字符串属性名称的简单数组。