> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# API 集成

> Devin 可以在您的应用程序中集成、配置和测试第三方 API。

<div id="integrating-sendgrid-into-an-application">
  # 将 SendGrid 集成到应用中
</div>

我们的示例应用是一个使用 Django Python Web 框架编写的在线教育平台。最近有人提交了一个 [PR](https://github.com/uncc-hice/edukona_backend/pull/47)，将 SendGrid 邮件 API 集成到该应用中。在本教程中，我们将让 Devin 尝试实现自己的 SendGrid 集成，以展示它如何与第三方 API 协同工作。

<div id="initial-prompt">
  #### 初始提示
</div>

在我们的提示中，我们向 Devin 提供了关于如何以及在何处集成 SendGrid hooks 的具体指令，并让 Devin 回退到上述 PR 合并之前的一个更早的提交哈希，以便为集成提供一个干净的起点。你可以在[这里](https://app.devin.ai/sessions/05d9bf38b65d4aa9a16a5c16c8b5fc5e)查看此次 Devin 实时会话。

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/01469dde6757a54d39579647204db2d8ad316b75-1334x536.png)
</Frame>

Devin 检查代码库，确认应用中不存在会与本次集成冲突的既有邮件功能实现。

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/daa91bce25d55187d9f637c3e195c65650eb9128-1256x592.png)
</Frame>

<div id="implementing-sendgrid">
  #### 集成 SendGrid
</div>

接下来它继续实现 SendGrid API，并提示我们提供 API 凭证。我们可以在 Devin 的环境中将这些凭据配置为 [Secrets](/zh/product-guides/secrets)，这样之后它就可以将其作为环境变量 (ENV) 访问。

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/1dc4794dca5a5eec9632fa106930b4ba623449f7-1310x1622.png)
</Frame>

在拿到正确的 API 凭证之后，Devin 完成了对 SendGrid 的实现。

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/101faac5f7d36b18c622cef27a9f700f4a22547f-1294x1634.png)
</Frame>

当我将 Devin 的 SendGrid 实现与我们在开头链接的实际已合并 PR 进行对比时，我注意到有几个显著的改进：

* Devin 在一个新的 email.py 模块中配置了 SendGrid，而不是和视图本身放在同一个文件中。它还会根据 SendGrid 的响应状态码返回 True 或 False，以指示邮件发送是否成功。
* Devin 使用了 Python 内置的 logging 模块而不是 print (这是 PR 审阅者特别指出的问题) 。
* Devin 还让发件人邮箱 (From email) 可配置，而不是写死在代码里，同时在 ENV 变量不存在时添加了一个默认值。
* Devin 为其 mailInstructor 方法添加了异常处理。

在核心实现完成后，我可以让 Devin 通过在我的邮箱地址下添加一个 instructor 账户来测试应用。为了测试应用，它还需要依次安装并配置所有依赖，例如 PostgreSQL 服务器以及相关的 Python 库。

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/162781b998d454f43ffb8ff226a8f7b50568800e-1282x796.png)
</Frame>

<div id="debugging">
  #### 调试
</div>

Devin 很快遇到了一个错误，这是因为我从未为我的 SendGrid 账户提供 FROM 地址。Devin 实际上在它的 [Browser](/zh/work-with-devin/devin-session-tools#interactive-browser) 中打开 API 文档，来弄清这里发生了什么，并理解错误信息和实现方面的最佳实践：

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/808fb112960206f72c6f451ad12a89c1dea709bd-1308x1062.png)
</Frame>

我可以回到 Secrets 对话框中，添加一个供 Devin 访问的 `SENDGRID_FROM_EMAIL` 变量。

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/7c0db2df23075a74594b00fd254f27c7745bf2a2-1520x744.png)
</Frame>

我还让 Devin 使用默认的 SendGrid 用户名「apikey」，因为我尚未为该 API 设置子账户：

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/77939146f2fd5baba1ac90ecac5111e4901db2b3-1312x1394.png)
</Frame>

<div id="adding-knowledge">
  #### 添加知识
</div>

Devin 注意到我的请求和实现需求是可以泛化的，并提示我添加它今后可以使用的[知识](/zh/product-guides/knowledge#what-is-knowledge)：

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/528762e066c609f5c408fcb4a55eadead2b59d0e-2522x828.png)
</Frame>

如果你愿意，你也可以进一步编辑这条知识，补充更多细节，以便在你团队未来计划开展的会话中复用这些策略。

<div id="testing">
  #### 测试
</div>

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/4d8fcae26a4eb91b734d53ec23e09a0aaca31f51-1346x1312.png)
</Frame>

在花了几分钟完成环境配置和搭建后，Devin 顺利结束了这次会话，我也在收件箱里看到了这封邮件。我并没有真正为 SendGrid 模板配置实际内容，但 API 请求已成功，因此 Devin 的工作就完成了！

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/36f648f15ccc4fc49c89ec2d9e6de8ace491ff2e-1406x882.png)
</Frame>

如果我选择提交 PR，Devin 已经为我起草好了消息，其中详细说明了它在应用中所做的全部更改以及这些更改的工作方式：

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/1a3375d78dce3cb1122332bd8566041946a73791-2206x1094.png)
</Frame>

立即注册[试用 Devin](https://cognition.com/get-started#company)，解决一个长期积压在你团队待办列表里的 API 集成难题。
