我想知道是否有可能以编程方式发现特定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路由?
答案 0 :(得分:26)
无法以编程方式发现REST服务 没有标准的注册服务。
除了做疯狂的暴力搜索之外,没有办法找到正确的URL(更不用说正确的参数)了。所以唯一的选择是记录您的API。为此,我目前看到的最佳选择是:
答案 1 :(得分:9)
一些RESTful API发布了一个Web应用程序描述语言资源(WADL - 发音类似于鸭子所做的那样 - 简称)。 JAX-RS或至少Jersy webapps默认会在应用程序根URL /application.wadl执行此操作。 Twitter的API似乎不是其中之一。许多REST纯粹主义者会认为API应该是自我描述的,并且只需通过与它交互并查看它将为您提供的其他端点就可以自我发现。
答案 2 :(得分:1)
您应该仅通过了解初始入口点就可以发现有关REST API所需了解的所有信息。这是REST的基本要点之一。应该由超媒体驱动并自我描述。这也是最少了解的原理之一。资源的发现取决于服务器响应中的超媒体链接。
早在2008 Roy Fielding started to get annoyed about people writing HTTP based APIs and calling them REST之前,就因为它是热门的事物。他提出了几点要点;
REST API 不得定义固定的资源名称或层次结构( 客户端和服务器之间的明显耦合)。服务器必须有自由 控制自己的名称空间。而是让服务器指示 客户如何构造适当的URI,例如HTML 表单和URI模板,方法是在媒体中定义这些说明 类型和链接关系。 [此处的失败表示客户 假设由于带外信息而导致的资源结构,例如 特定领域的标准,即面向数据的等同于 RPC的功能耦合]。
和
应该在没有知识的情况下输入REST API 初始URI(书签)和一组标准化媒体类型,它们是 适合预期的受众(即,希望能够被理解) 由可能使用该API的任何客户端)。从那时起,所有 应用程序状态转换必须由客户端选择 接收到的由服务器提供的选择 表示或由用户对这些表示的暗示 表示形式。过渡可以由以下因素确定(或限制): 客户对媒体类型和资源交流的了解 机制,可以同时实时改善这两种机制(例如, 按需编码)。 [此处的失败表示带外信息是 推动互动而不是超文本。]
实际上,这意味着入口点(通常使用根URI的“ /”)包含指向其他REST API的链接。这些API将包含指向其他API的链接,依此类推。不应有没有链接的API。那将意味着它是不可发现的。
这里的其他答案从根本上是错误的,因为它们没有承认REST的最基本原理。