访问 700 多个实验和课程

利用 Apigee X 开发和保护 API:实验室挑战赛

实验 2 个小时 30 分钟 universal_currency_alt 5 个点数 show_chart 中级
info 此实验可能会提供 AI 工具来支持您学习。
访问 700 多个实验和课程

GSP363

Google Cloud 自学实验的徽标

概览

在实验室挑战赛中,我们会为您提供一个场景和一系列任务。您将使用从课程的各个实验中学到的技能自行确定如何完成这些任务,而不是按照分步说明进行操作。自动评分系统(显示在本页面中)会提供有关您是否已正确完成任务的反馈。

在您参加实验室挑战赛期间,我们不会再教授新的 Google Cloud 概念知识。您需要拓展所学的技能,例如通过更改默认值和查看并研究错误消息来更正您自己所犯的错误。

要想获得满分,您必须在该时间段内成功完成所有任务!

我们建议已完成利用 Apigee X 开发和保护 API 课程中各个实验的学员参加此实验室挑战赛。准备好接受挑战了吗?

设置

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。

挑战场景

您是 Cymbal Shops(一家全国性零售商)的云工程师。Cymbal Shop 专注于全球销售,并已将翻译服务确定为帮助拓展全球业务的关键工具。您负责创建第一版的翻译 API。

您应该掌握了完成这些任务所需的技能和知识,所以我们不会提供分步指南。

您的挑战

您需要在项目的 Apigee 组织中创建一个新的 Apigee API 代理及其他资源。请仔细阅读每个任务说明,然后创建所需的功能。

保存错误

保存对 API 代理的更改时,您可能会遇到 Could not save new revision 错误。如果您使用“保存”下拉菜单按钮 (“保存”下拉菜单按钮),然后选择“另存为新修订版本”,应该就能看到一条错误消息,说明哪些内容无效。

任务 1. 创建 Cloud Translation API 代理

Cymbal Shops 已决定使用 Google Cloud 的 Translation API 作为其 API 代理的后端服务。

要求:

  1. Google Cloud 控制台中,在 API 库中确认已启用 Cloud Translation API
  2. 为 API 代理创建一个名为 apigee-proxy 的服务账号,并为其授予 Logging > Logs Writer 角色。
  3. Google Cloud 控制台中,从导航菜单中选择 Apigee 以打开 Apigee 界面并创建 API 代理
  4. 该 API 代理应该是一个名为 translate-v1反向代理,基本路径为 /translate/v1
  5. 该 API 代理的目标是 Cloud Translation API 基本版本的 HTTP 网址 (https://translation.googleapis.com/language/translate/v2)。
  6. 通过代理向导的“通用政策”页面添加授权、CORS 或配额。
  7. 在摘要页面上,将设置保留为默认值,创建 API 代理。
  8. 默认 TargetEndpoint 添加 Authentication 部分,以便在每次后端请求中发送访问令牌。使用 GoogleAccessToken 元素,并将“Scope”设置为 https://www.googleapis.com/auth/cloud-translation
注意:请修改代理,并在开发标签页的目标端点部分下,修改 default.xml 文件。
  1. 使用以下 Cloud Shell 脚本,确认已完全安装 Apigee 运行时:
export INSTANCE_NAME=eval-instance; export ENV_NAME=eval; export PREV_INSTANCE_STATE=; echo "waiting for runtime instance ${INSTANCE_NAME} to be active"; while : ; do export INSTANCE_STATE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}" | jq "select(.state != null) | .state" --raw-output); [[ "${INSTANCE_STATE}" == "${PREV_INSTANCE_STATE}" ]] || (echo; echo "INSTANCE_STATE=${INSTANCE_STATE}"); export PREV_INSTANCE_STATE=${INSTANCE_STATE}; [[ "${INSTANCE_STATE}" != "ACTIVE" ]] || break; echo -n "."; sleep 5; done; echo; echo "instance created, waiting for environment ${ENV_NAME} to be attached to instance"; while : ; do export ATTACHMENT_DONE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}/attachments" | jq "select(.attachments != null) | .attachments[] | select(.environment == \"${ENV_NAME}\") | .environment" --join-output); [[ "${ATTACHMENT_DONE}" != "${ENV_NAME}" ]] || break; echo -n "."; sleep 5; done; echo "***ORG IS READY TO USE***";

如果脚本返回 ORG IS READY TO USE,您便可以继续执行后续步骤。

注意:如果您正在等待运行时安装,可以提前阅读并规划任务 2 中的开发工作。
  1. 使用以下服务账号保存 translate-v1 代理并将其部署到 eval 环境:
apigee-proxy@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  1. 测试 API 代理。

Apigee 组织中的 eval 环境可以使用主机名 eval.example.com 进行调用。此 DNS 条目仅在内部网络中可用,因此您必须使用为您创建的虚拟机。

  1. 在 Cloud Shell 中,打开与 apigeex-test-vm 的 SSH 连接:
TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  1. 如果系统提示您进行授权,请点击授权。对于 gcloud 命令中提出的每个问题,点击 EnterReturn 键来指定默认输入。

  2. 成功完成任务 1 后,以下 curl 命令应该能进行文本翻译:

curl -i -k -X POST "https://eval.example.com/translate/v1" -H "Content-Type: application/json" -d '{ "q": "Translate this text!", "target": "es" }'

得到的响应应如下所示:

{ "data": { "translations": [ { "translatedText": "¡Traduce este texto!", "detectedSourceLanguage": "en" } ] } } 注意:在 API 代理完成完全部署之前,您可能会收到 502 错误响应,这种情况会持续几分钟。

点击检查我的进度以验证是否完成了以下目标: 创建 Cloud Translation API 代理

注意:如果绿色对勾标记未显示,请点击右上角的分数飞出菜单,然后点击相关步骤中的检查我的进度。系统会显示一个弹出式窗口,为您提供建议。

任务 2. 更改 API 请求和响应

Cymbal Shops 希望创建一个与 Translation API 提供的接口不同的 API。您需要修改两个 Translation API 调用。

第一个调用是为了检索有效语言的列表

Cloud Translation API 请求:

REQUEST: POST https://translation.googleapis.com/language/translate/v2/languages Authorization: Bearer ACCESSTOKEN Content-Type: application/json { "target": "en" }

Cloud Translation API 响应:

Content-Type: application/json { "data": { "languages": [ { "language": "af", "name": "Afrikaans" }, { "language": "sq", "name": "Albanian" }, ... ] } }

translate-v1 请求:

GET https://eval.example.com/translate/v1/languages

translate-v1 响应:

Content-Type: application/json [{"language":"af","name":"Afrikaans"},{"language":"sq","name":"Albanian"}, ... ]

API 代理必须将 GET 替换为 POST,移除“data”和“languages”响应字段,并从属性集中获取目标语言代码。访问令牌已由任务 1 中的 Authentication 部分自动添加。

第二个调用是为了将文本翻译成指定语言

Cloud Translate API 请求:

POST https://translation.googleapis.com/language/translate/v2 Authorization: Bearer ACCESSTOKEN Content-Type: application/json { "q": "Hello world!", "target": "de" }

Cloud Translate API 响应:

Content-Type: application/json { "data": { "translations": [ { "translatedText": "Hallo Welt!", "detectedSourceLanguage": "en" } ] } }

translate-v1 请求:

POST https://eval.example.com/translate/v1?lang=de Content-Type: application/json { "text": "Hello world!" }

translate-v1 响应:

Content-Type: application/json { "translated": "Hallo Welt!" }

API 代理必须通过“lang”查询参数获取目标语言,并更改传入文本和翻译后文本的字段名称。您可以选择省略 translate-v1 请求中的“lang”查询参数,在这种情况下,目标语言将通过属性集中的属性获取。

注意:对于“q”字段,Translation API 既接受单个字符串,也接受字符串数组。您的 API 应仅支持单个字符串。

要求:

  1. 在 API 代理中,创建一个名为 language.properties属性集。该属性集应包含两个属性:值为 es“output”和值为 en“caller”。“caller”属性将用于在列出语言时指定目标语言(即用于“name”字段的语言)。如果未提供“lang”查询参数,“output”属性将指定要使用的默认目标语言。

  2. 在代理端点中,为 POST / 资源创建路径和动词条件流,并将其命名为 translate

  3. 在代理端点中,为 /languages 资源创建路径(无动词)条件流,并将其命名为 getLanguages。(请勿添加动词。您需要把请求的动词从 GET [用于代理的输入] 修改为 POST [后端所需的动词]。如果您在条件中添加了动词,流程中的响应政策将不会执行,因为 request.verb 不再等于 GET。)

  4. 创建一个名为 AM-BuildTranslateRequestAssignMessage 政策,以便创建 translate 条件流中要用到的后端请求。

该政策应包含以下内容:

  • 一个带有模板的 AssignVariable,用于创建稍后将在记录消息中使用的变量。名为 text 的变量应使用 jsonPath 消息模板函数从请求中提取 text 字段。

  • 应使用 firstnonnull 消息模板函数来创建名为 language 的变量。如果存在“lang”查询参数,此变量应包含该参数;如果未指定“lang”查询参数,则此变量应包含语言属性集中用于指定目标语言的“output”属性。

  • 应使用 Set 部分来设置后端服务所需的 JSON 载荷。该载荷将使用您创建的两个变量。

  • [AssignTo] 元素应使用现有的请求消息。

    AssignMessage 政策中的 AssignVariable 部分应如下所示:

    <AssignVariable> <Name>...</Name> <Template>...</Template> <AssignVariable>
  1. translate 条件流下创建名为 AM-BuildTranslateResponseAssignMessage 政策,以使用 Translation API 响应为调用方创建响应。

该政策应包含以下内容:

  • 包含 jsonPath 模板的 AssignVariable,以创建名为 translated 的变量,以便从 Translation API 响应中提取“translatedText"字段。提示:用于提取此字段的 JSONPath 表达式为 $.data.translations[0].translatedText

  • “createNew”设置为 true。

  • 新的 JSON 载荷将使用“translated”变量。

    AssignMessage 政策中的 AssignVariable 部分应如下所示:

    <AssignVariable> <Name>...</Name> <Template>...</Template> <AssignVariable>
  1. 创建名为 AM-BuildLanguagesRequestAssignMessage 政策,以创建 getLanguages 条件流中使用的后端请求。

该政策应包含以下内容:

  • 使用 Set 为后端请求设置正确的 HTTP 方法和载荷。

  • 语言属性集中的“caller”属性应该用于后端载荷的“target”字段。

  • “createNew”设置为 true。

  • 将后端请求载荷的内容类型设置为 application/json

    AssignMessage 政策中的 AssignVariable 部分应如下所示:

    <AssignVariable> <Name>...</Name> <Set> ... </Set> </AssignVariable>
  1. getLanguages 条件流下创建名为 JS-BuildLanguagesResponseJavaScript 政策,为调用者创建响应。JavaScript 代码应使用以下步骤:

您的 JavaScript 代码应如下所示:

var payload = ...; var payloadObj = JSON.parse(...); var newPayload = JSON.stringify(...); context.setVariable(...); 注意:请务必在正确的条件流下创建所需的政策,并在相应的 .xml 文件中修改所需的政策配置。
  1. 测试 API。在 apigeex-test-vm 虚拟机中,使用以下 curl 命令测试上述示例:
  • 语言列表:

    curl -i -k -X GET "https://eval.example.com/translate/v1/languages"
  • 翻译成指定语言(德语):

    curl -i -k -X POST "https://eval.example.com/translate/v1?lang=de" -H "Content-Type:application/json" -d '{ "text": "Hello world!" }'
  • 翻译成默认语言(西班牙语):

    curl -i -k -X POST "https://eval.example.com/translate/v1" -H "Content-Type:application/json" -d '{ "text": "Hello world!" }'

点击检查我的进度以验证是否完成了以下目标: 更改 API 请求和响应

注意:如果绿色对勾标记未显示,请点击右上角的分数飞出菜单,然后点击相关步骤中的检查我的进度。系统会显示一个弹出式窗口,为您提供建议。

任务 3. 添加 API 密钥验证及配额强制执行流程

应该只让已获批准的应用访问此 API,因此您需要添加 VerifyAPIKey 政策以及配额政策来限制请求数量。

要求:

  1. 创建名称和显示名称均为 translate-productAPI 产品。此 API 产品应具有公开访问权限,会自动批准访问请求,并且可在 eval 环境中使用。

  2. translate-product API 产品添加一项操作。该操作应允许访问 translate-v1 代理,并使用 / 路径,该路径允许访问任何请求,包括 /。允许的方法为 GET 和 POST。添加每 1 分钟 10 个请求的操作配额设置。

  3. 创建一位邮箱为 joe@example.com 的开发者。您可以选择使用自己的名字、姓氏和用户名。

  4. 创建一个名为 translate-app 的应用,并为其启用 translate-product API 产品。您需要将其与您的 joe@example.com 开发者相关联。

  5. 向代理端点 preflow 添加一个名为 VA-VerifyKeyVerifyAPIKey 政策。API 密钥应为每个请求所必需,且应使用 Key 标头发送。

  6. 向代理端点 preflow 添加名为 Q-EnforceQuota配额政策

该政策应包含以下步骤:

  • 使用一种日历。该日历类型需要 StartTime 元素。
  • 指定 UseQuotaConfigInAPIProduct 以使用 API 产品的配额,如果 API 产品未指定配额设置,则默认配额为每小时 5 个请求。
  • “Distributed”和“Synchronous”设置为 true,并移除 AsynchronousConfiguration 元素。

完成这些更改后,如果 Key 标头中未指定有效的 API 密钥,请求应该会返回错误。

  1. apigeex-test-vm 虚拟机中,使用以下 curl 命令测试 API 密钥的功能:
  • 失败(无 API 密钥):

    curl -i -k -X POST "https://eval.example.com/translate/v1?lang=de" -H "Content-Type:application/json" -d '{ "text": "Hello world!" }'
  • 失败(API 密钥无效):

    curl -i -k -X POST "https://eval.example.com/translate/v1?lang=de" -H "Content-Type:application/json" -H "Key: ABC123" -d '{ "text": "Hello world!" }'
  • 成功(当 KEY 变量设置为有效的 API 密钥时,即 KEY=<从之前设置开发者应用的步骤中获取>):

    curl -i -k -X POST "https://eval.example.com/translate/v1?lang=de" -H "Content-Type:application/json" -H "Key: $KEY" -d '{ "text": "Hello world!" }'

点击检查我的进度以验证是否完成了以下目标: 添加 API 密钥验证及配额强制执行流程

注意:如果绿色对勾标记未显示,请点击右上角的分数飞出菜单,然后点击相关步骤中的检查我的进度。系统会显示一个弹出式窗口,为您提供建议。

任务 4. 添加消息日志记录

为了解翻译服务的使用情况,MessageLogging 政策将记录每条翻译后的消息。

要求:

  1. translate 条件流添加名为 ML-LogTranslationMessageLogging 政策。该政策必须在 AM-BuildTranslateResponse 步骤之后执行。
注意:请勿将其添加到 PostClientFlow,因为只需要针对翻译操作创建日志。
  1. 该政策应将日志记录到 Cloud Logging。请参阅此政策文档
  • LogName 的值应为:

    projects/{organization.name}/logs/translate
  • 所记录消息的“contentType”应为 text/plain,消息内容应为:

    {language}|{text}|{translated}

此消息需要 AM-BuildTranslateRequestAM-BuildTranslateResponse 政策中创建的“language”“text”和“translated”变量。

  1. 在 Google Cloud 控制台的日志记录页面中验证记录的消息。使用查询 logName : "translate" 可仅查看已翻译消息的日志。

  2. 成功添加 MessageLogging 政策后,使用以下 curl 命令:

curl -i -k -X POST "https://eval.example.com/translate/v1?lang=de" -H "Content-Type:application/json" -H "Key: $KEY" -d '{ "text": "Hello world!" }'
  • 该 curl 命令应该会创建包含以下内容的日志消息:

    de|Hello world!|Hallo Welt!
注意:记录的消息需要经过短暂的延迟才会显示在日志中。

点击检查我的进度以验证是否完成了以下目标: 添加消息日志记录

注意:如果绿色对勾标记未显示,请点击右上角的分数飞出菜单,然后点击相关步骤中的检查我的进度。系统会显示一个弹出式窗口,为您提供建议。

任务 5. 重写后端错误消息

如果发送到 Translation API 的“target”参数无效,会返回 400 Bad Request 错误消息:

{ "error": { "code": 400, "message": "Invalid Value", "errors": [ { "message": "Invalid Value", "domain": "global", "reason": "invalid" } ] } }

此错误消息会让调用者感到困惑,因此您需要重写该错误消息。

要求:

  1. 默认目标端点添加 FaultRules 部分。当后端返回 400 响应时,系统会自动评估目标端点中任何匹配的故障规则。
注意:左侧的界面导航菜单不能用于添加 FaultRules 部分。您必须在目标端点的 XML 配置中添加该部分。
  1. 向 FaultRules 部分添加 FaultRule。应将此 FaultRule 的条件设置为:在 fault.nameErrorResponseCode 时执行。

  2. 创建名为 AM-BuildErrorResponseAssignMessage 政策,并将其附加到 FaultRule。使用以下政策配置:

<AssignMessage name="AM-BuildErrorResponse"> <Set> <Payload contentType="application/json">{ "error": "请求无效。请检查 lang 查询参数。”}</Payload> </Set> </AssignMessage>

附加好政策后,目标端点的 FaultRules 部分应如下所示:

<FaultRules> <FaultRule name="..."> <Step> <Name>...</Name> </Step> <Condition>...</Condition> </FaultRule> </FaultRules> 注意:您需要手动修改目标端点 XML(确保它是 TargetEndpoint,而不是 ProxyEndpoint)。
  1. 测试 API。
  • 如下所示的有效请求应该仍能正常运行:

    curl -i -k -X POST "https://eval.example.com/translate/v1?lang=de" -H "Content-Type:application/json" -H "Key: $KEY" -d '{ "text": "Hello world!" }'
  • 如果语言查询参数无效(如下所示),系统应该会返回重写的错误消息:

    curl -i -k -X POST "https://eval.example.com/translate/v1?lang=invalid" -H "Content-Type:application/json" -H "Key: $KEY" -d '{ "text": "Hello world!" }'

点击检查我的进度以验证是否完成了以下目标: 重写后端错误消息

注意:如果绿色对勾标记未显示,请点击右上角的分数飞出菜单,然后点击相关步骤中的检查我的进度。系统会显示一个弹出式窗口,为您提供建议。

恭喜!

在参加本实验室挑战赛的过程中,您展示了自己对 Apigee X API 开发和安全性的理解。

“利用 Apigee X 开发和保护 API”徽章

赢得您的下一个技能徽章

本自学实验是利用 Apigee X 开发和保护 API 挑战任务的组成部分。完成此技能徽章挑战任务可赢得上面的徽章,以表彰您取得的成就。您可以在简历和社交平台中分享自己的徽章,并使用 #GoogleCloudBadge 让大家知道您取得的这一成就。

此技能徽章挑战任务是 Google Cloud 的 API 开发者学习路线的组成部分。您可以报名参加部署和管理 Apigee X 挑战任务,以继续深入学习。

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

本手册的最后更新时间:2024 年 7 月 10 日

本实验的最后测试时间:2024 年 7 月 10 日

版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

请使用无痕模式或无痕式浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。