Json 从RESTfulWeb服务递归下载资源

Json 从RESTfulWeb服务递归下载资源,json,rest,wget,swagger,Json,Rest,Wget,Swagger,我希望递归地从RESTful HTTP端点下载JSON资源,并将其存储在本地目录结构中,然后以包含HTTP URL的JSON字符串的形式链接到相关资源。Wget似乎是这项工作的一个可能工具,尽管它的递归下载显然仅限于HTML超链接和CSS url()引用 讨论中的资源是与类似的文档文件,不过在我的例子中,所有URL都是绝对的。招摇过市的模式相当复杂,但只要跟随任何看起来像绝对HTTP(S)URL的字符串就足够了。更好的做法是遵循“路径”属性中指定的绝对或相对路径 有人能推荐一个通用的递归爬虫程序

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

讨论中的资源是与类似的文档文件,不过在我的例子中,所有URL都是绝对的。招摇过市的模式相当复杂,但只要跟随任何看起来像绝对HTTP(S)URL的字符串就足够了。更好的做法是遵循“路径”属性中指定的绝对或相对路径


有人能推荐一个通用的递归爬虫程序来实现我在这里想要的功能吗?或者是一种轻量级的编写wget脚本或类似的方法来实现它吗?

我最后编写了一个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
这用于从索引文件中提取API路径,还用于在下载JSON时漂亮地打印JSON。如前所述,这可能只会引起仍在使用1.x招摇过市模式的人的兴趣,尽管我可以看到自己在将来为其他问题修改了这个脚本


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

如果有人好奇,我试图这样做是为了跟踪我们开发中API随时间的变化——在发布之前,我们可以将当前文档与上一版本的快照区分开来。我无法建议一种方法来完成您的要求,但对于一般信息,Swagger 2.0通常是单页声明,而不是多页声明(如果需要,它可以是多页的)所以diff会更容易。@webron-听起来这将是一个改进!不幸的是,我们的swagger文档是半自动生成的,我不认为swagger v2.0输出是一个选项。