{"id":47824,"date":"2023-08-21T00:38:16","date_gmt":"2023-07-25T13:18:06","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/"},"modified":"2024-04-30T19:25:48","modified_gmt":"2024-04-30T11:25:48","slug":"%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/","title":{"rendered":"\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6"},"content":{"rendered":"<h1>\u7b80\u8981\u8bf4\u660e<\/h1>\n<p>AWS Amplify Advent Calendar 2019\u300119\u65e5\u76ee\u3067\u306f\u3001AWS Amplify\u7684\u65b0\u529f\u80fdMocking\u5982\u4f55\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6\u7684\u65b9\u6cd5\u5c06\u4f1a\u88ab\u4ecb\u7ecd\u3002<\/p>\n<h2>\u201cAmplify Mocking\u201d \u662f\u4ec0\u4e48\u610f\u601d\uff1f<\/h2>\n<p>\u8fd9\u662f2019\u5e748\u67087\u65e5\u53d1\u5e03\u7684Amplify CLI\u7684\u65b0\u529f\u80fd\uff08\u5c3d\u7ba1\u5df2\u7ecf\u8fc7\u4e86\u4e00\u6bb5\u65f6\u95f4\uff09\u3002\u7531\u4e8e$ amplify push\u9700\u8981\u5f15\u7528\u548c\u66f4\u6539AWS CloudFormation\u5806\u6808\uff0c\u56e0\u6b64\u8fd9\u53ef\u80fd\u9700\u8981\u4e00\u4e9b\u65f6\u95f4\u3002\u4f7f\u7528$ amplify mock\u547d\u4ee4\uff0c\u60a8\u53ef\u4ee5\u5728\u5c06\u66f4\u6539\u5e94\u7528\u4e8e\u4e91\u8d44\u6e90\u4e4b\u524d\uff0c\u5728\u672c\u5730\u73af\u5883\u4e2d\u8fdb\u884c\u66f4\u6539\u540e\u7684\u64cd\u4f5c\u9a8c\u8bc1\u3002<\/p>\n<p>\u76ee\u524d\u63d0\u4f9b\u7684Mocking\u7c7b\u522b\u6709\u4ee5\u4e0b\u4e09\u79cd\u3002<\/p>\n<p>api(GraphQL): AWS AppSync + Amazon DynamoDB<\/p>\n<p>storage(Content): S3<\/p>\n<p>function: AWS Lambda<\/p>\n<p>\u672c\u6587\u5c06\u8be6\u7ec6\u63a2\u8ba8API\uff08GraphQL\uff09\u7684\u6a21\u62df\u800c\u5c06\u5b58\u50a8\u548c\u529f\u80fd\u7684\u6a21\u62df\u4ec5\u4f5c\u4e3a\u53c2\u8003\u8d44\u6599\u5206\u4eab\u3002<\/p>\n<h2>\u653e\u5927\u6a21\u62df\u6307\u4ee4<\/h2>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> amplify mock\r\n<span class=\"gp\">$<\/span> amplify mock api\r\n<span class=\"gp\">$<\/span> amplify mock storage\r\n<span class=\"gp\">$<\/span> amplify mock <span class=\"k\">function<\/span> &lt;functionname&gt;\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u7ee7\u7eed\u6307\u5b9a\u8981Mock\u7684Category\u6765\u5b9e\u73b0Mock\uff0c\u8fd9\u53ef\u4ee5\u5728amplify mock\u4e4b\u540e\u8fdb\u884c\u3002\u7531\u4e8e\u53ef\u4ee5\u5728\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u4e2d\u521b\u5efa\u591a\u4e2afunction\uff0c\u56e0\u6b64\u53ef\u4ee5\u660e\u786e\u4f20\u9012\u8981Mock\u7684function\u3002\u5982\u679c\u5728\u4e0d\u6307\u5b9aCategory\u7684\u60c5\u51b5\u4e0b\u6267\u884camplify mock\uff0c\u5219\u4f1a\u5f00\u59cbMock api\u548cstorage\u3002<\/p>\n<h2>\u5e0c\u671b\u5438\u5f15\u7684\u8bfb\u8005<\/h2>\n<p>\u7ed9\u90a3\u4e9b\u6b63\u5728\u4f7f\u7528amplify\u6dfb\u52a0api\u548c\u8c03\u6574AWS AppSync\u7684\u4eba\u63d0\u4f9b\u4e00\u79cd\u9009\u62e9\uff0c\u6bcf\u6b21\u7b49\u5f85amplify push\u7684\u65f6\u95f4\u771f\u7684\u5f88\u70e6\u4eba\u554a\u3002\u867d\u7136\u4e2d\u9014\u4f1a\u51fa\u73b0React\uff0c\u4f46\u4e0d\u9700\u8981\u4efb\u4f55\u4e86\u89e3React\u7684\u77e5\u8bc6\u3002<\/p>\n<h2>\u8bf7\u786e\u8ba4\u52a8\u4f5c\u73af\u5883<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">react 16.12.0<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">@aws-amplify\/cli 4.5.0<\/ul>\n<h2>\u53ef\u4ee5\u7528\u4ee5\u4e0b\u8cc7\u6599\u4f5c\u70ba\u53c3\u8003\u3002<\/h2>\n<p>\u6211\u4f1a\u9644\u4e0a\u4e00\u4e9b\u53c2\u8003\u8d44\u6599\u4f9b\u60a8\u53c2\u8003\u3002\u5982\u679c\u53ea\u662f\u5c1d\u8bd5Mocking\u529f\u80fd\uff0c\u6700\u5feb\u7684\u65b9\u6cd5\u662f\u53c2\u8003\u5e95\u90e8\u7684\u5b98\u65b9\u6587\u6863\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Mocking and Testing Serverless APIs with AWS Amplify &#8211; AWS Online Tech Talks &#8211; YouTube<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">New \u2013 Local Mocking and Testing with the Amplify CLI | AWS News Blog<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Developing and testing GraphQL APIs, Storage and Functions with Amplify Framework Local Mocking features | AWS Mobile Blog<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/aws-amplify.github.io\/docs\/cli-toolchain\/quickstart?sdk=js#mocking-and-testing<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">https:\/\/aws-amplify.github.io\/docs\/cli-toolchain\/usage?sdk=js#mocking-and-testing<\/ul>\n<h1>\u51c6\u5907\u9a8c\u8bc1\u5e94\u7528\u7a0b\u5e8f<\/h1>\n<h2>\u53cd\u5e94\u5e94\u7528<\/h2>\n<p>\u5728\u8fd9\u4e2a\u6b65\u9aa4\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528React\u8fdb\u884c\u64cd\u4f5c\uff0c\u4f46\u662f\u60a8\u4e5f\u53ef\u4ee5\u4f7f\u7528\u5176\u4ed6\u6846\u67b6\uff08\u5982Vue\u3001Angular\u3001Ionic\uff09\u6765\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u4e0d\u9700\u8981\u66f4\u6539\u4efb\u4f55\u4ee3\u7801\uff0c\u8fd9\u4e5f\u662f\u53ef\u4ee5\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> npx create-react-app amplify-react\r\n<span class=\"gp\">$<\/span> <span class=\"nb\">cd <\/span>amplify-react\r\n<span class=\"gp\">$<\/span> npm start\r\n<\/code><\/pre>\n<p>\u6d4f\u89c8\u5668\u542f\u52a8\u540e\uff0c\u719f\u6089\u7684\u8d77\u59cb\u9875\u9762\u4f1a\u51fa\u73b0\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/22-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u653e\u5927\u5668\u7684\u521d\u59cb\u8bbe\u7f6e<\/h2>\n<p>\u8bf7\u4f7f\u7528amplify init\u8fdb\u884cAmplify\u7684\u521d\u59cb\u914d\u7f6e\u3002<br \/>\n\u5047\u8bbe\u5df2\u7ecf\u6267\u884c\u8fc7amplify configure\u3002\uff08\u5982\u679c\u8fd8\u6ca1\u6709\u6267\u884camplify configure\uff0c\u8bf7\u70b9\u51fb\u6b64\u5904\uff09<br \/>\n\u8bf7\u5728${profile name}\u4e2d\u8f93\u5165\u60a8\u6b63\u5728\u4f7f\u7528\u7684Amplify AWS Profile\u7684\u540d\u79f0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> amplify init\r\n<span class=\"go\">\r\n? Enter a name for the project amplify-react\r\n? Enter a name for the environment mocktest\r\n? Choose your default editor: Vim (via Terminal, Mac OS only)\r\n? Choose the type of app that you're building javascript\r\nPlease tell us about your project\r\n? What javascript framework are you using react\r\n? Source Directory Path:  src\r\n? Distribution Directory Path: build\r\n? Build Command:  npm run-script build\r\n? Start Command: npm run-script start\r\nUsing default provider  awscloudformation\r\n\r\nFor more information on AWS Profiles, see:\r\nhttps:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/cli-multiple-profiles.html\r\n\r\n? Do you want to use an AWS profile? Yes\r\n<\/span><span class=\"gp\">? Please choose the profile you want to use $<\/span><span class=\"o\">{<\/span>profile name<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u521b\u5efa GraphQL API<\/h2>\n<p>\u8ba9\u6211\u4eec\u5728amplify add api\u547d\u4ee4\u4e2d\u8bbe\u7f6e\u7528\u4e8e\u9a8c\u8bc1\u6a21\u62df\u7684\u540e\u7aef\u3002\u91cd\u70b9\u662f\u8bbe\u7f6e\u4f7f\u7528API\u5bc6\u94a5\u8fdb\u884c\u4e00\u6b21\u6027\u8bbe\u7f6e\uff0c\u5e76\u5728\u6b64\u57fa\u7840\u4e0a\u6dfb\u52a0Amazon Cognito\u7528\u6237\u6c60\u548cAWS IAM\u7684\u989d\u5916\u8ba4\u8bc1\u3002\u8fd9\u662f\u4e3a\u4e86\u5728\u540e\u7eed\u4f7f\u7528@auth\u65f6\u8fdb\u884c\u6a21\u62df\u9a8c\u8bc1\u3002\u8bf7\u53c2\u8003\u56fe\u7247\u8fdb\u884c\u8bbe\u7f6e\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/28-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u51c6\u5907\u597d\u4e86\uff01\u8ba9\u6211\u4eec\u5b9e\u9645\u4f7f\u7528Mocking\u3002<\/p>\n<h1>API \u6a21\u62df<\/h1>\n<h2>\u8ba9\u6211\u4eec\u8bd5\u8bd5API\u6a21\u62df\uff01<\/h2>\n<p>\u8ba9\u6211\u4eec\u7f16\u8f91\u521a\u521a\u6dfb\u52a0API\u7684AppSync\u7684schema.graphql\u3002<\/p>\n<pre class=\"post-pre\"><code>type Todo \r\n@model \r\n@key(fields: [\"id\"])\r\n@auth(rules: [\r\n  {allow: owner, provider: userPools, operations: [create, read, update, delete]},\r\n  {allow: private, provider: userPools, operations: [read]},\r\n  {allow: public, provider: apiKey,operations: [read]},\r\n])\r\n{\r\n  id: ID!\r\n  name: String!\r\n  owner: String!\r\n  description: String\r\n  updatedAt: AWSDatetime\r\n  createdAt: AWSDatetime\r\n}\r\n<\/code><\/pre>\n<p>\u8bf7\u53c2\u9605\u6211\u7684\u8457\u4f5c\u300aAmplify CLI GraphQL Transform\u4e0eAppSync+DynamoDB\u7684\u6307\u4ee4\u63a2\u7a76\u300b\u4e2d\u5bf9@auth\u7684\u89e3\u91ca\uff0c\u8be5\u6307\u4ee4\u901a\u8fc7\u4f7f\u7528@model\u548c@key\u5728schema.graphql\u4e2d\u5b9e\u73b0\u4ee5\u4e0b\u6388\u6743\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Cognito User Pool\u3067\u8a8d\u8a3c\u3057\u305f\u30e6\u30fc\u30b6\u30fc\u306b\u6b21\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u8a31\u53ef<\/ul>\n<\/li>\n<\/ul>\n<p>Todo\u306ecreate<br \/>\n\u81ea\u8eab\u304c\u4f5c\u6210\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u306eread, update, delete<br \/>\n\u4ed6\u306e\u4eba\u304c\u4f5c\u6210\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u306eread<\/p>\n<p>AppSync\u306eAPI_KEY\u3067\u8a8d\u8a3c\u3057\u305f\u30e6\u30fc\u30b6\u30fc\u306b\u306fread\u306e\u307f\u3092\u8a31\u53ef<\/p>\n<p>\u5728\u6267\u884c&#8221;amplify push&#8221;\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u5148\u5728\u4e91\u8d44\u6e90\u4e2d\u6a21\u62df\u4e00\u4e0b&#8221;amplify mock api&#8221;\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> amplify mock api\r\n<span class=\"go\">Failed to start API Mock endpoint Error: Type \"AWSDatetime\" not found in document.\r\n<\/span><\/code><\/pre>\n<p>\u6211\u9047\u5230\u4e86\u4e00\u4e2a\u9519\u8bef\uff0c\u663e\u793a\u4e3a\u627e\u4e0d\u5230AWSDatetime\u7c7b\u578b\u3002\u6839\u636eAppSync\u7684\u6807\u91cf\u7c7b\u578b\uff0c\u5e94\u8be5\u4f7f\u7528AWSDateTime\u624d\u6b63\u786e\u3002\u6211\u72af\u4e86\u4e2a\u9519\u8bef\uff0c\u8ba9\u6211\u4eec\u7f16\u8f91schema.graphql\u89e3\u51b3\u5427\u3002<\/p>\n<pre class=\"post-pre\"><code>type Todo \r\n@model \r\n@key(fields: [\"id\"])\r\n@auth(rules: [\r\n  {allow: owner, provider: userPools, operations: [create, read, update, delete]},\r\n  {allow: private, provider: userPools, operations: [read]},\r\n  {allow: public, provider: iam, operations: [read]},\r\n  {allow: public, provider: apiKey,operations: [read]},\r\n])\r\n{\r\n  id: ID!\r\n  name: String!\r\n  owner: String!\r\n  description: String\r\n  updatedAt: AWSDateTime\r\n  createdAt: AWSDateTime\r\n}\r\n<\/code><\/pre>\n<p>\u5982\u679c\u60a8\u6b63\u5728\u8fd0\u884c magnify mock api\uff0c\u5219\u5b83\u5c06\u68c0\u6d4b\u5230\u66f4\u6539\u5e76\u91cd\u65b0\u52a0\u8f7d\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/41-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u8fd9\u6b21\u7f16\u8bd1\u901a\u8fc7\u4e86\uff01\u53ef\u4ee5\u5728\u4e0d\u8fdb\u884c$ amplify push\u7684\u60c5\u51b5\u4e0b\u8bd5\u7528\u8fd9\u4e9b\u7ec6\u5c0f\u9519\u8bef\u771f\u662f\u4ee4\u4eba\u9ad8\u5174\u3002<br \/>\n\u4e3a\u4e86\u81ea\u52a8\u751f\u6210\u7528\u4e8e\u4ece\u524d\u7aef\u4f7f\u7528GraphQL\u8fdb\u884c\u67e5\u8be2\u7684\u4ee3\u7801\uff0c\u6211\u4eec\u4f1a\u95ee\u4f60\u4e00\u4e9b\u95ee\u9898\u3002\u4f60\u53ef\u4ee5\u9009\u62e9\u9ed8\u8ba4\u9009\u9879\u3002<\/p>\n<p>\u5728\u6b63\u5e38\u60c5\u51b5\u4e0b\uff0c\u4f1a\u663e\u793a\u7528\u4e8eMock\u7684API\u7aef\u70b9\u3002\u4f46\u5982\u679c\u5728\u51fa\u73b0\u9519\u8bef\u540e\u8fdb\u884c\u4e0a\u8ff0\u8bbe\u7f6e\uff0c\u5219\u4f3c\u4e4e\u65e0\u6cd5\u663e\u793aAPI\u7aef\u70b9\u3002\u8bf7\u5148\u4f7f\u7528Ctrl+C\u505c\u6b62\u6267\u884c\uff0c\u7136\u540e\u518d\u6b21\u6267\u884c$ amplify mock api\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/44-0.png\" alt=\"image.png\" \/><\/div>\n<p>http:\/\/192.168.1.6:20002\u4e0a\u5df2\u7ecf\u542f\u52a8\u4e86GraphQL\u7684\u6a21\u62df\u670d\u52a1\u5668\uff01\u5176\u4e2d\u7684192.168.1.6\u90e8\u5206\u662f\u60a8\u5728\u9a8c\u8bc1\u73af\u5883\u7f51\u7edc\u4e2d\u5206\u914d\u7ed9\u60a8\u7684\u4e2a\u4eba\u7535\u8111\uff08\u6216\u670d\u52a1\u5668\u7b49\uff09\u7684\u672c\u5730IP\u5730\u5740\u3002<\/p>\n<h2>\u901a\u8fc7API\u6a21\u62df\u521b\u5efa\u7684\u4e1c\u897f<\/h2>\n<p>\u5f53\u80fd\u591f\u8fd0\u884cAPI\u6a21\u62df\u65f6\uff0c\u8bf7\u786e\u4fdd\u901a\u8fc7`amplify mock api`\u547d\u4ee4\u786e\u8ba4\u6240\u521b\u5efa\u7684\u5185\u5bb9\uff0c\u5e76\u5bf9\u6574\u4f53\u60c5\u51b5\u6709\u6240\u4e86\u89e3\u3002\u6839\u636e\u300aAWS\u65b0\u95fb\u535a\u5ba2\u300b\u4e2d\u7684\u201c\u4f7f\u7528Amplify CLI\u8fdb\u884c\u672c\u5730\u6a21\u62df\u548c\u6d4b\u8bd5\u201d\u7684\u6587\u7ae0\uff0c`amplify mock api`\u547d\u4ee4\u5c06\u521b\u5efa\u4ee5\u4e0b\u8d44\u6e90\u3002<\/p>\n<blockquote><p>\u60a8\u7684API\u6240\u9700\u7684GraphQL\u8f6c\u6362<br \/>\n\u4f7f\u7528DynamoDB\u672c\u5730\u7248\u672c\u6765\u672c\u5730\u5316\u7ba1\u7406API\u6570\u636e<br \/>\n\u57fa\u4e8e\u5f00\u6e90OneGraph graphiql-explorer\u63d2\u4ef6\u7684Amplify GraphQL Explorer<\/p><\/blockquote>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">GraphQL transformatinos<\/ul>\n<\/li>\n<\/ul>\n<p>schema.graphql\u304b\u3089GraphQL\u3067\u4f7f\u7528\u3055\u308c\u308b\u3088\u308a\u8a73\u7d30\u306aschema\u3001resolver\u3001\u304a\u3088\u3073\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3067\u4f7f\u7528\u3059\u308b\u30b3\u30fc\u30c9\u3092\u751f\u6210<\/p>\n<p>DynamoDB Local<\/p>\n<p>SQLite\u306eDB\u3092DynamoDB\u98a8\u306e\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u30e9\u30c3\u30d7\u3057\u305f\u3082\u306e\u3067\u3001Amplify GraphQL Explorer\u306eDB\u3068\u3057\u3066\u4f7f\u7528<br \/>\nSQLite\u306a\u306e\u3067SQLite\u304c\u8aad\u3081\u308b\u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u3044\u308c\u3066\u81ea\u7531\u306b\u95b2\u89a7\u30fb\u7de8\u96c6\u53ef\u80fd<\/p>\n<p>Amplify GraphQL Explorer<\/p>\n<p>OSS\u306eOneGraph graphiql-explorer plugin\u3092\u30d9\u30fc\u30b9\u306b\u958b\u767a\u3055\u308c\u305fGraphiQL(GraphQL IDE\u3068\u3082)\u30d7\u30e9\u30b0\u30a4\u30f3<br \/>\nHTTP\u306b\u3088\u308b\u30af\u30a8\u30ea\u3092\u53d7\u3051\u4ed8\u3051\u308bGraphQL\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3068\u3001\u30af\u30a8\u30ea\u3092\u624b\u8efd\u306b\u8a66\u305b\u308bGUI\u3092\u63d0\u4f9b<\/p>\n<p>\u6ca1\u6709\u88ab\u4ecb\u7ecd\uff0c\u4f46\u662f\u4e00\u79cd\u76f8\u5bf9\u4fbf\u5229\u7684\u65b9\u6cd5\u662f\u4f7f\u7528aws-exports\u5728\u6a21\u62df\u671f\u95f4\u5c06\u672c\u5730\u7684Mock API Endpoint\u6307\u5b9a\u4e3a\u76ee\u6807\u3002\u7a0d\u540e\u6211\u4eec\u4f1a\u786e\u8ba4\u8fd9\u4e2a\u529f\u80fd\u3002<\/p>\n<h2>GraphQL \u63a2\u7d22\u5668\u653e\u5927<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/52-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u8bf7\u6253\u5f00 Amplify GraphQL Explorer\u3002\u6211\u4eec\u6765\u521b\u5efa\u4e00\u4e9b\u9879\u76ee\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/54-0.png\" alt=\"image.png\" \/><\/div>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u70b9\u51fb&#8221;ADD NEW MUTATION&#8221;<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u70b9\u51fb&#8221;createTodo&#8221;<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5728\u7d2b\u8272\u6587\u5b57\u7684input\u5b57\u6bb5\u4e2d\uff0c\u586b\u5199\u5fc5\u586b\u5b57\u6bb5id\u3001name\u3001owner\uff08\u5fc5\u586b\u5b57\u6bb5\u5c06\u5e26\u6709*\uff0c\u5982id*\uff09<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u52fe\u9009\u8981\u8fd4\u56de\u7684\u5b57\u6bb5\uff08\u672c\u4f8b\u4e2d\u5168\u9009\uff09<\/ol>\n<p>\u6709\u4e86GraphiQL\u7684\u652f\u6301\uff0c\u6211\u4eec\u53ef\u4ee5\u975e\u5e38\u8f7b\u677e\u5730\u7f16\u5199mutation\u3002\u73b0\u5728\uff0c\u70b9\u51fb\u4e0a\u65b9\u7684\u25b6\u6765\u6267\u884c\u5b83\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/57-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u5b9e\u9645\u7ed3\u679c\u5c06\u663e\u793a\u5728\u53f3\u4fa7\u3002\u51fa\u73b0\u9519\u8bef\u3002\u5f53\u9605\u8bfb\u6d88\u606f\u65f6\uff0c\u663e\u793a\u4e86\u6ca1\u6709\u8bbf\u95eecreateTodo\u6743\u9650\u7684\u4fe1\u606f\u3002\u8ba9\u6211\u4eec\u56de\u60f3\u4e00\u4e0b\u5728schema.graphql\u4e2d\u5199\u7684\u5185\u5bb9\u3002<\/p>\n<blockquote><p>\u5141\u8bb8Cognito\u7528\u6237\u6c60\u4e2d\u7ecf\u8fc7\u8eab\u4efd\u9a8c\u8bc1\u7684\u7528\u6237\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a<br \/>\n&#8211; \u521b\u5efa\u5f85\u529e\u4e8b\u9879<br \/>\n&#8211; \u8bfb\u53d6\u3001\u66f4\u65b0\u3001\u5220\u9664\u81ea\u5df1\u521b\u5efa\u7684\u9879\u76ee<br \/>\n&#8211; \u8bfb\u53d6\u5176\u4ed6\u4eba\u521b\u5efa\u7684\u9879\u76ee<\/p>\n<p>\u5bf9\u4e8e\u7ecf\u8fc7IAM\u8eab\u4efd\u9a8c\u8bc1\u7684\u7528\u6237\u548c\u4f7f\u7528AppSync\u7684API_KEY\u8eab\u4efd\u9a8c\u8bc1\u7684\u7528\u6237\uff0c\u53ea\u5141\u8bb8\u8bfb\u53d6\u64cd\u4f5c\u3002<\/p><\/blockquote>\n<p>\u5f53\u67e5\u770b\u53f3\u4e0a\u89d2\u65f6\uff0c\u4f1a\u663e\u793a\u201cUse: API Key\u201d\u3002\u4eceAmplify GraphQL Explorer\u53d1\u51fa\u67e5\u8be2\u65f6\uff0c\u53ef\u4ee5\u660e\u786e\u4f7f\u7528API_KEY\u4f5c\u4e3a\u8eab\u4efd\u9a8c\u8bc1\u4fe1\u606f\u3002\u7531\u4e8e\u4f7f\u7528API_KEY\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\u7684\u7528\u6237\u4ec5\u83b7\u5f97\u8bfb\u53d6\u6743\u9650\uff0c\u56e0\u6b64\u88ab\u62d2\u7edd\u8bbf\u95ee\u3002\u8fd9\u8868\u660eAmplify GraphQL Explorer\u6709\u6548\u5730\u518d\u73b0\u4e86@auth\u8fdb\u884c\u6388\u6743\u7684\u529f\u80fd\u3002<\/p>\n<p>\u90a3\u4e48\uff0c\u8ba9\u6211\u4eec\u5207\u6362\u5230\u5177\u6709create\u6743\u9650\u7684Cognito\u7528\u6237\u6c60\u8ba4\u8bc1\u7684\u7528\u6237\u3002<br \/>\n\u70b9\u51fbAPI\u5bc6\u94a5\uff0c\u5e76\u5207\u6362\u5230\u7528\u6237\u6c60\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/62-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u63a5\u4e0b\u6765\u70b9\u51fb\u65c1\u8fb9\u7684\u201c\u66f4\u65b0\u8eab\u4efd\u9a8c\u8bc1\u201d\u6309\u94ae\uff0c\u6253\u5f00\u201c\u8eab\u4efd\u9a8c\u8bc1\u9009\u9879\u201d\u3002<br \/>\n\u5728\u201c\u7528\u6237\u540d\u201d\u548c\u201c\u7535\u5b50\u90ae\u4ef6\u201d\u5b57\u6bb5\u4e2d\u8f93\u5165\u9002\u5f53\u7684\u503c\uff0c\u7136\u540e\u70b9\u51fb\u201c\u751f\u6210\u4ee4\u724c\u201d\u3002<br \/>\n\u8bf7\u6ce8\u610f\uff0c\u7528\u6237\u540d\u9700\u8981\u4e0e\u53d8\u5f02\u4e2d\u7684input\u7684owner\u5b57\u6bb5\u5339\u914d\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/64-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u8ba9\u6211\u4eec\u5c1d\u8bd5\u5728\u8fd9\u79cd\u72b6\u6001\u4e0b\u518d\u6b21\u6267\u884c\u53d8\u5f02\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/66-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u6211\u6210\u529f\u5730\u8fdb\u884c\u4e86\u65e0\u4e8b\u53d8\u5f02\uff01<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/68-0.png\" alt=\"image.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/69-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u6211\u4eec\u5931\u8d25\u4e86\uff0c\u5c31\u50cf\u8bbe\u5b9a\u7684\u4e00\u6837\u3002<br \/>\n\u6700\u540e\uff0c\u6211\u4eec\u5c06API_KEY\u8eab\u4efd\u9a8c\u8bc1\u6539\u4e3alistTodo\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/71-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u5df2\u7ecf\u786e\u8ba4\u53ef\u4ee5\u901a\u8fc7 API_KEY \u8ba4\u8bc1\u8fdb\u884c\u8bfb\u53d6\u3002<\/p>\n<h2>\u4ece\u672c\u5730\u7684React\u5e94\u7528\u7a0b\u5e8f\u8c03\u7528\u6a21\u62df\u7684\u7aef\u70b9<\/h2>\n<p>\u5f53\u4f60\u5728Amplify CLI\u4e2d\u4f7f\u7528`amplify add {category}`\u5e76\u6267\u884c`amplify push`\u65f6\uff0c\u5b83\u4f1a\u81ea\u52a8\u5c06Amplify Framework\uff08SDK\uff09\u521b\u5efa\u7684\u8d44\u6e90\u6240\u9700\u7684\u4fe1\u606f\u5199\u5165\u5230aws-exports.js\u6587\u4ef6\u4e2d\u3002\u901a\u8fc7\u4f7f\u7528aws-exports.js\u6587\u4ef6\uff0c\u4f60\u53ef\u4ee5\u8f7b\u677e\u5730\u8fdb\u884cAmplify\u7684\u521d\u59cb\u8bbe\u5b9a\uff0c\u5e76\u4e14\u5373\u4f7f\u8fdb\u884c\u8d44\u6e90\u7684\u4fee\u6539\u6216\u6dfb\u52a0\uff0c\u4e5f\u65e0\u9700\u4fee\u6539\u914d\u7f6e\uff0c\u975e\u5e38\u65b9\u4fbf\u3002<\/p>\n<p>\u4f8b\u5982\uff0c\u5728JavaScript\u4e2d\uff0c\u53ef\u4ee5\u50cf\u4e0b\u9762\u8fd9\u6837\u8fdb\u884cAmplify\u7684\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">awsmobile<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/aws-exports<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">aws-amplify<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsmobile<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u8ba9\u6211\u4eec\u67e5\u770baws-exports.js\u6587\u4ef6\u7684\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">awsmobile<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">aws_project_region<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">us-west-2<\/span><span class=\"dl\">\"<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">awsmobile<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u4e00\u6b21\u56e0\u4e3a\u4ece\u672a\u6267\u884c\u8fc7$ amplify push\uff0c\u6240\u4ee5\u6ca1\u6709\u4efb\u4f55\u5173\u4e8e\u8d44\u6e90\u7684\u63cf\u8ff0\u3002\u5728\u8fd9\u79cd\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u6267\u884c$ amplify mock api\u4f1a\u600e\u4e48\u6837\u5462\uff1f<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> amplify mock api\r\n<\/code><\/pre>\n<p>\u8ba9\u6211\u4eec\u4fdd\u6301API Mocking\u7684\u72b6\u6001\uff0c\u5e76\u67e5\u770baws-exports.js\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">awsmobile<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">aws_project_region<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">us-west-2<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">aws_appsync_graphqlEndpoint<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">http:\/\/10.221.93.66:20002\/graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">aws_appsync_region<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">us-west-2<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">aws_appsync_authenticationType<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">API_KEY<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">aws_appsync_apiKey<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">da2-fakeApiId123456<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">aws_appsync_dangerously_connect_to_http_endpoint_for_testing<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">awsmobile<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u8981\u4e00\u79cd\u9009\u62e9\uff1a<br \/>\n\u5728\u8fdb\u884cAPI Mocking\u65f6\uff0c\u5b83\u4f1a\u4fee\u6539aws-exports.js\u4ee5\u6307\u5411\u672c\u5730\u7684GraphQL\u7aef\u70b9\uff01\u5f88\u65b9\u4fbf\uff01\u987a\u4fbf\u63d0\u4e00\u53e5\uff0c\u8fd9\u91cc\u4f7f\u7528\u4e86API_KEY\u8ba4\u8bc1\uff0c\u4f46\u5728\u524d\u9762\u7684Amplify GraphQL Explorer\u4e2d\u8fdb\u884cUpdate Auth\u5e76\u8bbe\u7f6e\u4e3aUse: User Pool\u540e\uff0c\u4f3c\u4e4e\u4e0d\u4f1a\u5728aws-exports.js\u4e2d\u53cd\u6620\u51fa\u6765&#8230;\u8ba9\u6211\u4eec\u671f\u5f85\u66f4\u65b0\u5427\u3002<\/p>\n<p>\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528Ctrl+C\u9000\u51faAPI Mocking\uff0c\u7136\u540e\u68c0\u67e5aws-exports.js\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">awsmobile<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">aws_project_region<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">us-west-2<\/span><span class=\"dl\">\"<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">awsmobile<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u4f60\u53ef\u4ee5\u770b\u5230\u5b83\u5df2\u7ecf\u56de\u5230\u4e86\u7a7a\u8361\u8361\u7684\u72b6\u6001\u3002<\/p>\n<h1>API\u4f2a\u9020\u6280\u5de7\u7684\u5efa\u8bae<\/h1>\n<p>\u6211\u5c06\u4e3a\u60a8\u4ecb\u7ecd\u4e00\u4e9b\u5173\u4e8eAPI Mocking\u7684\u5c0f\u77e5\u8bc6\u3002<\/p>\n<h2>\u652f\u6301API Mocking\u7684\u6307\u4ee4<\/h2>\n<p>\u6839\u636e https:\/\/aws-amplify.github.io\/docs\/cli-toolchain\/usage?sdk=js#api-mocking-setup\uff0c\u76ee\u524d\u4ec5\u67095\u4e2a\u6307\u4ee4\u4e0e$ amplify mock api\u529f\u80fd\u76f8\u5339\u914d\u3002\u4ec5@searchable\u548c@prediction\u6307\u4ee4\u4e0d\u4e0e\u4e4b\u5339\u914d\u3002<\/p>\n<pre class=\"post-pre\"><code>- @auth\r\n- @key\r\n- @connection\r\n- @versioned\r\n- @function\r\n<\/code><\/pre>\n<h2>\u5bf9DynamoDB Local\u8fdb\u884c\u7834\u574f\u6027\u7684\u66f4\u6539<\/h2>\n<p>\u8bf7\u6ce8\u610f\uff1a\u4e0b\u9762\u4ecb\u7ecd\u7684\u6280\u5de7\u662f\u4e00\u4e9b\u79d8\u7c4d\uff0c\u53ef\u80fd\u5728\u672a\u6765\u7684\u66f4\u65b0\u4e2d\u53d8\u5f97\u4e0d\u518d\u9700\u8981\uff0c\u6216\u8005\u672c\u6765\u5c31\u6709\u5176\u4ed6\u65b9\u6cd5\u3002\uff08\u5982\u679c\u6709\u5176\u4ed6\u65b9\u6cd5\uff0c\u8bf7\u52a1\u5fc5\u544a\u8bc9\u6211\u4eec\uff01\uff09\u8bf7\u60a8\u901a\u8fc7\u67e5\u770b\u6587\u6863\u6216GitHub\u83b7\u53d6\u6700\u65b0\u4fe1\u606f\u3002<\/p>\n<p>\u5728\u8fdb\u884c\u5f00\u53d1\u65f6\uff0c\u6709\u65f6\u53ef\u80fd\u4f1a\u5e0c\u671b\u5bf9DynamoDB\u8fdb\u884c\u7834\u574f\u6027\u7684\u66f4\u6539\uff0c\u6d89\u53ca\u5230PK\u548cSK\u7684\u53d8\u66f4\u3002\u5982\u679c\u662f\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6dfb\u52a0GSI\uff08\u5168\u5c40\u4e8c\u7ea7\u7d22\u5f15\uff09\u6216\u8005\u5728\u7ef4\u62a4\u7a97\u53e3\u4e2d\u8fdb\u884c\u8868\u8fc1\u79fb\u3002\u4e0d\u597d\u610f\u601d\u518d\u6b21\u63d0\u53ca\uff0c\u5982\u679c\u60a8\u611f\u5174\u8da3\uff0c\u6211\u5728\u4e4b\u524d\u7684Amplify Advent Calendar\u6587\u7ae0\u4e2d\u4ecb\u7ecd\u4e86\u5982\u4f55\u4f7f\u7528Amplify\u7684GSI\u529f\u80fd\uff0c\u8bf7\u968f\u4fbf\u53c2\u9605\u3002<\/p>\n<p>\u6211\u7a81\u7136\u6709\u4e00\u80a1\u51b2\u52a8\uff0c\u60f3\u8981\u5728name\u5b57\u6bb5\u800c\u4e0d\u662fid\u5b57\u6bb5\u4e0a\u8fdb\u884c\u67e5\u8be2\u3002\u8ba9\u6211\u4eec\u5c06schema.graphql\u66f4\u6539\u4e3a\u4ee5\u4e0b\u65b9\u5f0f\u3002<\/p>\n<pre class=\"post-pre\"><code>type Todo \r\n@model \r\n@key(fields: [\"name\"])\r\n@auth(rules: [\r\n  {allow: owner, provider: userPools, operations: [create, read, update, delete]},\r\n  {allow: private, provider: userPools, operations: [read]},\r\n  {allow: public, provider: iam, operations: [read]},\r\n  {allow: public, provider: apiKey,operations: [read]},\r\n])\r\n{\r\n  id: ID!\r\n  name: String!\r\n  owner: String!\r\n  description: String\r\n  updatedAt: AWSDateTime\r\n  createdAt: AWSDateTime\r\n}\r\n<\/code><\/pre>\n<p>\u5f53\u67e5\u770bamplify mock api\u7684\u65e5\u5fd7\u65f6\uff0c\u4f3c\u4e4e\u53ef\u4ee5\u5f88\u987a\u5229\u5730\u8fdb\u884c\u66f4\u6539\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">GraphQL schema compiled successfully.\r\n\r\n...\uff08\u4e2d\u7565\uff09...\r\n\r\nCreating table DataStore locally\r\nCreating table TodoTable locally\r\nRunning GraphQL codegen\r\n\u2714 Generated GraphQL operations successfully and saved at src\/graphql\r\n<\/span><\/code><\/pre>\n<p>\u8bf7\u786e\u4fddGraphQL Explorer\u5df2\u91cd\u65b0\u52a0\u8f7d\uff0c\u7136\u540e\u5c1d\u8bd5\u6267\u884cMutation\u3002<br \/>\n\u8bf7\u786e\u8ba4\u4e3aUse User Pool\u65b9\u6cd5\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/99-0.png\" alt=\"image.png\" \/><\/div>\n<p>DynamoDB: \u53d1\u751f\u4e86ValidationException\u3002\u8fd9\u662f\u56e0\u4e3aValidator\u5c06PK, SK\u8f6c\u6362\u540e\u7684Mutation\u6295\u5165\u4e86\u4e0e\u521b\u5efa\u65f6\u76f8\u540c\u7684DynamoDB Local\u4e2d\u3002\uff08\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u5bf9\u4e8e$ amplify push\u6765\u8bf4\uff0c\u5305\u542bDynamoDB\u7684PK, SK\u66f4\u65b0\u7684\u66f4\u6539\u4f1a\u5728CloudFormation\u6267\u884c\u65f6\u88ab\u62d2\u7edd\u3002\uff09<br \/>\n\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5982\u679c\u662f\u4e91\u8d44\u6e90\uff0c\u53ef\u4ee5\u5148\u5c06\u60f3\u8981\u4fee\u6539\u7684type\u5b8c\u5168\u6ce8\u91ca\u6389\uff0c\u7136\u540e\u6267\u884c$ amplify push\u5220\u9664DynamoDB Table\uff0c\u7136\u540e\u518d\u53d6\u6d88\u6ce8\u91ca\u5e76\u6267\u884c$ amplify push\u91cd\u65b0\u521b\u5efa\u3002\u5bf9\u4e8eAPI Mocking\u7684\u60c5\u51b5\uff0c\u5220\u9664SQLite\u6587\u4ef6\u53ef\u80fd\u4f1a\u6709\u5e2e\u52a9\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> <span class=\"nb\">rm <\/span>amplify\/mock-data\/dynamodb\/fake_us-fake-1.db\r\n<span class=\"gp\">$<\/span> amplify mock api\r\n<span class=\"go\">GraphQL schema compiled successfully.\r\n\r\nCreating table DataStore locally\r\nCreating table TodoTable locally\r\nRunning GraphQL codegen\r\n\u2714 Generated GraphQL operations successfully and saved at src\/graphql\r\nAppSync Mock endpoint is running at http:\/\/10.221.93.17:20002\r\n<\/span><\/code><\/pre>\n<p>\u4ece\u65e5\u5fd7\u4e2d\u53ef\u4ee5\u770b\u51faTodoTable\u5df2\u88ab\u521b\u5efa\u3002\u66f4\u65b0Amplify GraphQL Explorer\uff0c\u7136\u540e\u518d\u6b21\u6267\u884cMutation\u5c1d\u8bd5\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/103-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u63a5\u4e0b\u6765\u6267\u884c\u67e5\u8be2\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/105-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u6ca1\u6709\u95ee\u9898\uff0c\u6211\u80fd\u591f\u4f7f\u7528\u65b0\u7684PK\u5b57\u6bb5name\u6765\u8c03\u7528getTodo\u3002<\/p>\n<h1>\u603b\u7ed3<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Mocking\u306b\u3088\u308a\u3001\u30af\u30e9\u30a6\u30c9\u30ea\u30bd\u30fc\u30b9\u306b\u5909\u66f4\u53cd\u6620\u3059\u308b\u524d\u306b\u3001\u5909\u66f4\u5f8c\u306e\u52d5\u4f5c\u78ba\u8a8d\u3092\u30ed\u30fc\u30ab\u30eb\u74b0\u5883\u3067\u884c\u3046\u3053\u3068\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Mocking\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u308bCategory\u306fAPI(GraphQL)\u3001Storage\u3001Function\u306e\u4e09\u3064<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">API Mocking\u304c\u63d0\u4f9b\u3059\u308b\u306e\u306f\u6b21\u306e\u56db\u3064\u3067\u3059<\/ul>\n<\/li>\n<\/ul>\n<p>GraphQL transformations<br \/>\nDynamoDB Local<br \/>\nAmplify GraphQL Explorer<br \/>\naws-exports.js\u306e\u81ea\u52d5\u7de8\u96c6<\/p>\n<p>\u901a\u8fc7 Amplify Mocking\uff0c\u6211\u4eec\u611f\u53d7\u5230\u5f00\u53d1\u901f\u5ea6\u5927\u5e45\u63d0\u9ad8\u3002\u4e0d\u592a\u53ef\u80fd\u56de\u5230\u90a3\u4e2a\u4e3a\u4e86\u8be6\u7ec6\u66f4\u6539\u786e\u8ba4\u800c\u8fdb\u884c amplify push \u7684\u65f6\u4ee3\u4e86\u3002\u8bf7\u52a1\u5fc5\u5c1d\u8bd5 API Mocking\uff0c\u8fd8\u6709 Storage\u3001Function \u7684 Mocking\uff01<\/p>\n<p>AWS Amplify Advent Calendar\uff0c\u660e\u5929\u662f @rtaguchi \u5148\u751f\u7684\u8f6e\u5230\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u8981\u8bf4\u660e AWS Amplify Advent Calendar 2019\u300119\u65e5\u76ee\u3067\u306f\u3001AWS Amplif [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-47824","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5f00\u59cb\u4f7f\u7528aws-amplify-mocking\u6765\u5927\u5e45\u63d0\u9ad8graphql-api\u5f00\u53d1\u901f\u5ea6\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6\" \/>\n<meta property=\"og:description\" content=\"\u7b80\u8981\u8bf4\u660e AWS Amplify Advent Calendar 2019\u300119\u65e5\u76ee\u3067\u306f\u3001AWS Amplif [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5f00\u59cb\u4f7f\u7528aws-amplify-mocking\u6765\u5927\u5e45\u63d0\u9ad8graphql-api\u5f00\u53d1\u901f\u5ea6\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-25T13:18:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T11:25:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/22-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/\",\"name\":\"\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-07-25T13:18:06+00:00\",\"dateModified\":\"2024-04-30T11:25:48+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5f00\u59cb\u4f7f\u7528aws-amplify-mocking\u6765\u5927\u5e45\u63d0\u9ad8graphql-api\u5f00\u53d1\u901f\u5ea6\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6","og_description":"\u7b80\u8981\u8bf4\u660e AWS Amplify Advent Calendar 2019\u300119\u65e5\u76ee\u3067\u306f\u3001AWS Amplif [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5f00\u59cb\u4f7f\u7528aws-amplify-mocking\u6765\u5927\u5e45\u63d0\u9ad8graphql-api\u5f00\u53d1\u901f\u5ea6\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-07-25T13:18:06+00:00","article_modified_time":"2024-04-30T11:25:48+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8168913a08637a6ad198\/22-0.png"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/","name":"\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-07-25T13:18:06+00:00","dateModified":"2024-04-30T11:25:48+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5f00\u59cb\u4f7f\u7528AWS Amplify Mocking\u6765\u5927\u5e45\u63d0\u9ad8GraphQL API\u5f00\u53d1\u901f\u5ea6"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8aws-amplify-mocking%e6%9d%a5%e5%a4%a7%e5%b9%85%e6%8f%90%e9%ab%98graphql-api%e5%bc%80%e5%8f%91%e9%80%9f%e5%ba%a6\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47824","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=47824"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47824\/revisions"}],"predecessor-version":[{"id":93828,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47824\/revisions\/93828"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=47824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=47824"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=47824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}