为什么要使用 REST?
虽然 API 或应用程序插件有很多种类和标准,但我将讨论我个人最喜欢的 REST 服务。您可能会问,“为什么是 REST?”答案很简单,它比 SOAP 更容易。还有其他原因,REST 支持的数据格式比仅支持 XML 的 SOAP 多。我认为 REST 是最好的另一个重要原因是它与 JSON 相辅相成。
JSON(JavaScript 对象表示法)通常提供更快的数据分析,这意味着这种轻量级数据格式可以更好地支持浏览器。最后,在 Mendix 不需要安装任何客户端库或文件即可使您的应用程序运行。
我正在使用什么 API?
Google Cloud API 拥有一整套 Google 的最佳服务,这些服务都分解为可用的方法,其中许多方法完全免费使用。但是,在与任何这些 API 交互之前,您的请求需要使用 OAuth 令牌进行身份验证。Google 使用 OAuth 2.0 作为其大多数 API 的实际身份验证方法。这意味着,为了让用户使用 Google API,他们首先需要调用 Google 身份 API (对于服务器端应用程序),以便对 Google 的服务进行任何后续调用。
换句话说,获取令牌是实现许多 Google API 的第一步,对于想要进入 API 开发领域的人来说是一个很好的起点。
硬件需求
在开始之前,本博客假设您已为 Google Cloud Platform 上的项目启用了任何 Google API,并完成了 OAuth 凭证页面 以及 Oauth 同意屏幕 针对该 Google 项目。具体来说,您需要为您的应用配置重定向 URL,使其指向您的本地主机或已部署的 Web 应用程序,并且在配置应用的 OAuth 客户端后,您需要拥有 Google 提供的客户端 ID 和客户端密钥。
关于 REST 方法
在此示例中,我使用 POST 方法调用 Google 的 Identity API,但这意味着什么?在 REST 中,您必须了解 5 种方法:
- 解决方案&帖子 — 用于创建新记录
- 的GET — 返回一条记录或记录列表
- PUT — 用于更新或替换记录
- 补丁 — 用于更新或修改记录
- 删除 — 删除或放宽记录
我知道还有一些其他方法,但我在工作中从未遇到过,如果你感兴趣的话,这里有一个很好的方法总结 点击此处。
集成 REST 服务的总体规划
根据您使用的方法和使用的 API,完成集成的实际步骤可能会有所不同,例如,GET 请求没有请求主体,而是使用查询字符串。但一般来说,以下是在以下情况下使用 REST 服务的步骤: Mendix 工作室专业版:
- 设定您的位置
- 也称为端点或 URI,这是服务托管的位置
2. 选择 HTTP 方法
- 对于上述方法的选择,一般API文档会告诉你选择哪一种。
3。 认证
- 可以是 OAUTH、API 密钥,或者根本不需要。
4。 HTTP标头
- 标头可以扮演各种角色,每个服务都可以拥有独特的标头,您需要参考您尝试使用的 API 的文档。
要设置响应的格式,我们可以使用标题“内容类型”并为其提供值“应用程序/JSON” 表示 JSON 格式,或 “应用程序/XML” 表示 XML。还有其他选项,例如“应用程序/x-www-form-urlencoded',我们将在本教程中使用它(查看此 stack overflow 帖子,获取有关 所有内容类型).
5. 创建请求
- 对于大多数方法,您需要提供请求主体,通常采用 JSON 格式。对于 GET 方法,我们通常使用添加到位置末尾的查询字符串来传递参数,通常由位置末尾的“?”标识,也称为 URI。
6.处理响应
- 这里有几个选项,将响应存储在字符串变量中,或应用将数据映射到域模型的导入映射,这里的最佳选项会因情况而异,但在大多数情况下,您应该选择应用导入映射。
Google Identity 如何运作?
在我们开始之前,先简单解释一下 Google 如何为服务器端应用程序实现 OAuth 2.0。
谷歌的文档 通过 5 个步骤进行解释,我将在这里为您总结: 为 Web 服务器应用程序使用 OAuth 2.0 | Google 身份 | Google 开发者.
步骤1:设置授权参数
这意味着我们需要在 Mendix 应用程序,详细说明了我们的应用程序代表用户从 Google 的服务中想要访问的内容。
在第 2 步中,用户将转到此 Google URL 以批准访问用户的 Google 帐户,然后他们将被重定向回您的 Mendix 应用程序,以及我们将用于授权令牌请求的访问代码。
这里的重要价值是:
- 重定向 URI (应重定向到你的应用的 URL),
- 领域 (Google API 的权限,例如邮件/驱动器/翻译等,请点击 开始 以获取 Google API 的所有范围的列表)
- 客户ID (在 OAuth 下注册您的应用后,Google 会提供客户端 ID)
- 州 (应用程序用来维护状态的值,稍后您可以使用该标识符来检索正确的请求)
以下是该 URL 的示例:
https://accounts.google.com/o/oauth2/v2/auth?范围=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-translation&访问类型=离线&包括授予的范围=真&响应类型=代码&州= 123&重定向uri=https://localhost:8080/link/googleredirect?码=&client_id=281413935351-jh5hs5chgf9n84eeqhpodrfq6oir2qnk.apps.googleusercontent.com
第 2 步:重定向到 Google 的 OAuth 2.0 服务器
将用户重定向到您在步骤 1 中创建的 URL(我使用了 Nanoflows 中提供的 Open URL Javascript Action)

第 3 步:Google 提示用户同意

Google 要求用户登录/选择他们的帐户,然后批准您的应用请求的访问权限。

步骤 4:处理 OAuth 2.0 服务器响应
在用户验证了对其帐户的请求后,Google 会将用户重定向到我们在步骤 1 中提供的重定向 URI 参数。这是您的应用 URL,但就我而言,我使用了 深层链接 模块来处理重定向。这样我就可以访问 Google 包含在链接中的授权代码。这是为处理此问题而创建的深层链接的示例:
https://localhost:8080/link/googleredirect?code=
步骤 5:交换授权码以获取刷新和访问令牌
一旦 Google 为您提供 访问代码,您现在可以进行 REST 调用来将其兑换为官方令牌。以下是我的示例的请求和响应
我已经在 Google 上删除了我的项目,发布此项目后,这些请求将无法正常工作(您需要使用自己的客户端 ID 和客户端密钥)
POST 请求的请求内容 https://oauth2.googleapis.com/token?grant_type=authorization_code&client_id=281413935351-jh5hs5chgf9n84eeqhpodrfq6oir2qnk.apps.googleusercontent.com&client_secret=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&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Flink%2Fgoogleredirect%3FCode%3D HTTP/1.1 内容类型:application/x-www-form-urlencoded
code=4%2F0AdQt8qiGaCaJYgKgRpHKqXj8265JL72PfsKpusgctqYXhVwPxg5qn4EHU9iUGnMxMiHiqA
POST 请求的响应内容 https://oauth2.googleapis.com/token?grant_type=authorization_code&client_id=281413935351-jh5hs5chgf9n84eeqhpodrfq6oir2qnk.apps.googleusercontent.com&client_secret=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&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Flink%2Fgoogleredirect%3FCode%3D HTTP/1.1 200 OK Cache-Control:no-cache、no-store、max-age=0、must-revalidate Pragma:no-cache 日期:01 年 2022 月 12 日星期一 53:44:01 GMT 到期时间:1990 年 00 月 00 日星期一 00:8:2 GMT 内容类型:application/json;charset=utf-0 变化:来源变化:X-Origin 变化:Referer 服务器:HTTPServer3 上的脚手架 X-XSS-Protection:443 X-Frame-Options:SAMEORIGIN X-Content-Type-Options:nosniff Alt-Svc:h2592000=”:3";ma=29,h443–2592000=”:3"; ma=050,h443-Q2592000=”:3”; ma=046,h443-Q2592000=”:3”; ma=043,h443-Q2592000=”:443”; ma=2592000,quic=”:46,43”;马=XNUMX; v=”XNUMX” 传输编码:分块
{
“access_token”: “ya29.A0AVA9y1tawnqK-42beGFAomiTqx8Zg0UUiedmIIPaAIraSas6VEO2D7NH5rInBPCUQK_7aghDiiTVrD_SnnQzOAtGq3XP2GQfWbpuZmDFjWfL0FSAw6JQU37mthQnRFsJvvqlgzTcryTdruKiOtcc63YrI8DvYUNnWUtBVEFTQVRBU0ZRRTY1ZHI4NjVOQUxhR2ppS0kyOVpINVZoYTJ4Zw0163”,
“expires_in”: 3599,
“scope”: “https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/cloud-translation", “token_type”: “持有者” }
现在您希望了解这背后的架构,我们可以深入了解调用 Token API 的具体细节。
调用 API Mendix
设置位置
要设置您的位置,请转到调用 REST 操作的属性(在微流中),然后单击编辑。您可以在此处设置位置,方法是提供 API 所在的 URI(在引号内),因为它是 字符串值.
不过,最佳做法是创建一个应用程序常量来存储它,这样您就不必担心拼写错误或复制粘贴错误。
地点是 https://oauth2.googleapis.com/token。请记住,我们将在位置末尾附加一个查询。

选择 HTTP 方法
如上所述,我们使用 POST 方法 用于此集成。我选择这个是因为 Google 的文档表明在他们的示例中应该如此。
接下来是身份验证
为了确保我们是注册用户,我们需要在请求中向 Google 发送一些详细信息。我们需要提供 客户端 ID 和客户端密钥 我们的应用程序是由谷歌发布的(作为查询字段),我们需要传递 访问代码 在请求正文中授予用户。
我们需要什么标题?
对于此请求,我们只需要添加标头'内容类型' 并赋予它价值 “应用程序/ x-www-form-urlencoded'。我们传递这个信息是因为它告诉 Google 您的请求使用的是什么格式。
在假设没有文档之前,请务必检查所提供的文档,因为不包含所需的标题通常会导致 401 响应(错误请求)。
建立查询
由于我们需要在 URI 中传递请求的一些参数,因此我们需要将查询附加到 API 的基本位置。
基地位置:
https://oauth2.googleapis.com/token
附加查询字符串:
?授权类型=授权码&CLIENT_ID=281413935351-jh5hs5chgf9n84eeqhpodrfq6oir2qnk.apps.googleusercontent.com&客户秘密=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&重定向uri=http%3A%2F%2Flocalhost%3A8080%2Flink%2Fgoogleredirect%3FCode%3
以下是 Google 对每个字段含义的详细说明:

记得对你的查询进行 URL 编码 在提出请求之前。
URL 编码?那是什么?
如果查询字符串中有任何特殊字符或空格,则会导致 401 错误(错误请求)。这只是将这些特殊字符转换为浏览器普遍接受的字符的一种方法。URL 编码是 Mendix,您可以在任何微流或纳流中调用它。
现在你可以把所有内容附加在一起,你的最终字符串看起来应该是这样的
https://accounts.google.com/o/oauth2/v2/auth?范围=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-translation&访问类型=离线&包括授予的范围=真&响应类型=代码&州= 1&重定向uri=https://localhost:8080/link/googleredirect?code=&CLIENT_ID=281413935351-jh5hs5chgf9n84eeqhpodrfq6oir2qnk.apps.googleusercontent.com
请记住,实际查询语句将包含您的凭据并提供您的应用程序用户的访问代码和重定向 URL,因此它会与我的不同。
定义请求主体
由于这是一个 Post 方法,因此我们需要提供请求主体。在请求下,选择 自定义请求模板 并提供正文:
代码=您的用户访问代码

现在来处理响应
Mendix 允许我们 应用导入映射 将响应数据映射到您的域模型中。
为此,您需要一个 JSON 示例来说明响应应该是什么。Google 在其文档中为我们提供了此示例。
{ “access_token”:“1/fFAGRNJru1FTz70BzhT3Zg”, “expires_in”:“3920”, “token_type”:“Bearer”, “scope”:“https://www.googleapis.com/auth/drive.metadata.readonly”, “refresh_token”:“1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI” }
在 Studio Pro 中,选择调用 REST 活动的响应选项卡下的“应用导入映射”。
从出现的窗口中选择创建一个新的导入映射并为该映射命名。
进入导入映射编辑器后,单击“选择元素”。选择“JSON 结构”作为此选项。
选择或 创建 JSON 映射,并指定一个合适的名称。现在将上面的 JSON 粘贴到文本区域中,然后单击“刷新”。

单击“确定”关闭此窗口。现在返回“选择元素”屏幕,单击展开全部,然后选中全部,然后单击确定。

接下来,在导入映射中,您现在只需单击“自动映射”即可。Studio Pro 将自动创建任何所需的实体和关联。默认情况下,这些将被创建为非持久性实体(驻留在内存中且未提交到数据库的实体)。您可以根据需要手动修改此映射,但大多数情况下没有,您可以将其保留原样。
您现在可以访问和检索微流中的 API 返回的数据。

在您的应用中可以访问数据后如何处理数据的具体细节由您决定。每项服务都不同,没有两种实现方式是相同的。

在我的示例中,我将 Token 存储在可持久实体中,该实体链接到数据库中的用户帐户,但在实际实现中,您还应该考虑添加加密。
这就是所有人的
如果您想了解更多关于如何在 REST 服务中实现 REST 服务的信息,我希望这篇文章对您有所帮助。 Mendix,看看我们的 文件 页面了解更多信息,或者访问我们的 学院 并开始学习。