【问题标题】:Recursively download resources from RESTful web service从 RESTful Web 服务递归下载资源
【发布时间】:2014-10-20 10:21:31
【问题描述】:

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

有问题的资源是类似于this oneSwagger 文档文件,尽管在我的情况下所有URL 都是绝对的。 Swagger 模式相当复杂,但它足以跟随任何看起来像绝对 HTTP(S) URL 的字符串。更好的是遵循“路径”属性中指定的绝对或相对路径。

谁能建议一个通用的递归爬虫来做我想要的,或者一个轻量级的脚本 wget 或类似的方法来实现它?

【问题讨论】:

  • 如果有人好奇,我正在尝试这样做以跟踪我们开发中的 API 随时间的变化——在发布之前,我们可以将当前文档与之前的快照进行比较释放。
  • 无法建议按照您的要求执行的方法,但对于一般信息,Swagger 2.0 通常是单页声明而不是多页声明(它可以多页(如果需要))所以差异会更容易。
  • @webron - 听起来这将是一个改进!不幸的是,我们的 swagger 文档是半自动生成的(使用 swagger-springmvc),我不认为 Swagger v2.0 输出是一种选择。

标签: json rest wget swagger


【解决方案1】:

我最终写了一个 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 属性,它是字符串属性名称的普通数组。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2023-03-08
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多