有没有一种方法可以发现 RESTAPI 的所有端点?

我想知道是否有可能通过编程方式发现特定 API 的所有端点。

例如,如果我通过浏览器或者 cURL 得到这个 URL: Https://api.twitter.com/1.1/

我可能会得到类似这样的 JSON 响应:

"TwitterAPI":{
"version" : 1.1,
"GET" : {
"search/" : ["users", "trending"],
"users/" : ["id", "handle"]
}
}

当然 Twitter 可以选择发布或不发布这种格式。因此,作为一个附带问题,是否有任何 Java 或 JavaScript 库将自动映射和发布您在控制器中创建的 API 路由?

155215 次浏览

一些 RESTful API 发布 Web 应用程序描述语言资源(WADL-发音类似于鸭子的散步-简称)。JAX-RS,或者至少 Jersy webapps 将在应用程序根 URL/application.wadl 处默认执行此操作。Twitter 的 API 似乎不是其中之一。许多 REST 纯粹主义者会争辩说,API 应该是自我描述和自我发现的,只要与它交互,看看它会给你什么其他的端点。

来自维基百科的更多关于 WADL 的信息..。

不存在以编程方式发现 REST 服务的方法 没有标准的注册服务。

除了做一些疯狂的暴力搜索法,没有办法找到正确的 URL (更不用说正确的参数)。所以唯一的选择就是记录你的 API。因此,到目前为止,我所见过的最佳选择是:

通过只知道初始入口点,您应该能够发现有关 RESTAPI 所需要了解的所有内容。这是 REST 的基本要点之一; 它应该是超媒体驱动和自描述的。这也是人们理解最少的原则之一。资源的发现取决于服务器响应中的超媒体链接。

回到很久以前的 2008年,Roy Fielding 开始对人们编写基于 HTTP 的 API 并称之为 REST 感到恼火只是因为它是热门的新事物。以下是他提出的一些观点:

REST API 不能定义固定资源名称或层次结构(an 客户端和服务器的明显耦合)。服务器必须有自由 控制它们自己的名称空间。相反,允许服务器指示 客户端了解如何构造适当的 URI,例如使用 HTML 表单和 URI 模板,方法是在媒体中定义这些指令 类型和链接关系。[这里的失败意味着客户端是 由于带外信息而假定资源结构,例如 一个特定于领域的标准,它相当于 RPC 的功能耦合]。

还有

一个 REST API < strong > 应该在没有任何先验知识的情况下输入 初始 URI (书签)和一组标准化的媒体类型 适用于预期的受众(即,预期会被理解) 任何可能使用该 API 的客户端) 应用程序状态转换必须由客户端选择 服务器提供的选项 表示或暗示的用户的操作 转换可以由 客户对媒体类型和资源传播的知识 这两种机制都可以在运行中得到改进(例如, 这里的失败意味着带外信息是 驱动交互而不是超文本。]

实际上,这意味着入口点(通常使用“/”的根 URI)包含到其他 REST API 的链接。这些 API 将包含到其他 API 的链接等等。不应该存在没有链接到它的 API。那就意味着它不会被发现。

这里的其他答案从根本上是错误的,因为它们没有认识到 REST 的最基本原则。

有一种方法可以从网站内部获得大部分隐藏的 REST-Apis。