【问题标题】:What do I not understand about APIs?我对 API 有什么不明白的地方?
【发布时间】:2014-05-26 14:14:47
【问题描述】:

维基百科定义:

在计算机编程中,应用程序编程接口 (API) 指定了一些软件组件应如何相互交互。

我看到有些人将库的 api 视为文档。就像在 api.jquery.com 上一样,它们展示了 jquery 库是如何被使用的。我还看到人们将 api 定义为库的可见部分

我了解 web api 的工作原理:您可以使用一个接口与使用 JSON 或 XML 的 web 应用程序进行交互,例如youtube api。这样我就可以获得有关 youtube 视频或播放列表的信息。

我了解到有不同类型的 api。 Web api's、library api's、OS api's etc.

这里有一些例子,希望我能解开我的困惑。


示例 1

如果我在 C++ 中包含一个库,那么头文件就是 API?像 Win32/Winapi 这样的 api 怎么样。为什么这被称为 api 而不是库?难道我不只是将它包含在我的源代码中并开始使用它吗?

示例 2

如果我想在 C# 中使用库,我会在我的 bin 文件夹中添加一个 .DLL,并告诉编译器我想使用该库(即使用 System.Web)。 api 是否只是库中编写的类中的所有公共成员(因此可见部分)?

示例 3

假设公司 X 编写了一个 MMORPG 游戏,但他们没有网站 api。我想制作一个 Windows 应用程序,并且希望可以在我的应用程序中查看任何字符。我将如何与游戏通信以获取这些数据? api写在哪里?如何查看?


操作系统会有什么样的 api?我怎么能用它?有什么例子吗?

【问题讨论】:

    标签: language-agnostic terminology


    【解决方案1】:

    API 是服务提供者和服务消费者(您的程序)之间的合同。就是这个。它是如何完成的,它是特定于实现的。

    提供者同意“如果您使用参数 Y 调用函数 X,我向您保证结果将是 Z。”的合同。但是客户端也同意“调用函数X,参数类型为T”,不是废话。

    Ad1:您的代码是一个库。它可以实现许多隐藏功能,例如void Nuke_hidden(double lat, double lon);,它可以打击世界上的任何地方。但是您可以选择不公开此方法。取而代之的是,其他一些将enum 参数限制为New York, London, Moscow 的参数。

    现在您的代码如何做某事是您的库的主体。你允许你的消费者用它做什么,是你 API 的一部分。你的合同明确规定只轰炸这 3 个城市,禁止轰炸其他任何地方。

    Ad2:你明白了。没错。

    Ad3:如果有人不公开和记录 API,通常是因为他们不希望您编写这样的程序 :)。但是他们必须有某种 API(即使他们从来没有这样称呼它),客户端使用它来与服务器通信。

    【讨论】:

    • 您能解释一下您所说的合同是什么意思吗?对我来说,合同是两方之间的协议,因此在这种情况下,服务提供者和消费者。但我无法理解合同与图书馆的可见部分有什么关系。为什么windows api叫api而不叫library?
    • @user1534664 首先,一个 API 可以使用多个库来实现(Windows 就是这种情况)。其次,库可以包含比实际 API 更多的功能——它们可能是公开的或隐藏的。第三:不需要使用库来实现 API。例如:Ebay 有一个 API,但您与 WEB 服务器交互以使用该 API。
    • @ThorstenDittmar 问题是我一直试图想象 API 是什么,认为它是某种对象,如库,而实际上它是抽象的(因此是契约)。非常感谢你们俩。
    • @user1534664:您可以将单词contract 替换为trust。它相信文档是正确的。严格来说,如果没有文档,“事物”(无论是什么,无论是 http 请求还是函数调用)都不能称为 API,而仅仅是代码。
    • @user1534664 我想说的是,当您授予其他人访问接口时,接口就变成了 API。
    【解决方案2】:

    API 只是定义如何与软件组件交互。例如,ebay 的 API 可以包含创建拍卖的函数调用和检索拍卖的所有出价的函数调用。

    API 既不是软件,也不是文档,也不是 DLL。 API 是如何与软件“对话”的抽象定义。如何实现取决于提供 API 的开发者。

    当然,要告诉其他程序员如何使用您的软件,您需要提供 API 文档。即:有哪些呼叫可用?他们需要和接受哪些参数?

    因此,关于示例 1) 头文件将定义如何使用 C++ 使用您的 API。就像 Windows 一样。 Windows 有一个 API(即:应用程序可以用来创建窗口、文本框等的接口)。头文件定义了如何在 C++ 中使用它。

    关于示例 2) .NET DLL 是软件与托管代码中的 API 交互的一种方式。您可以说 C# 中的每个类都定义了一个 API,因为它具有公共成员。

    关于示例 3) 并非每个软件都提供对其他软件的内部访问。例如:Word 确实有一个 API,您可以使用它来创建加载项。其他软件不提供这样的 API。

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多