{"id":2612,"date":"2023-11-25T21:52:49","date_gmt":"2023-11-25T13:52:49","guid":{"rendered":"http:\/\/yaochenkun.site\/?p=2612"},"modified":"2024-11-23T15:52:36","modified_gmt":"2024-11-23T07:52:36","slug":"swagger_openapi","status":"publish","type":"post","link":"http:\/\/yaochenkun.site\/index.php\/2023\/11\/25\/swagger_openapi\/","title":{"rendered":"Swagger + OpenAPI Generator \u5feb\u901f\u751f\u6210\u591a\u8bed\u8a00 SDK"},"content":{"rendered":"<h3>\u5f15\u8a00<\/h3>\n<p>\u4e3a\u4e86\u5c06\u81ea\u5df1\u7684\u670d\u52a1\u63d0\u4f9b\u51fa\u53bb\u4f9b\u7b2c\u4e09\u65b9\u4f7f\u7528\uff0c\u5f80\u5f80\u9700\u8981\u628a\u670d\u52a1\u4ee5\u6807\u51c6\u7684 OpenAPI \u5f62\u5f0f\u66b4\u9732\uff0c\u5e76\u63d0\u4f9b\u591a\u8bed\u8a00\u7248\u672c\u7684 SDK\uff08\u8f6f\u4ef6\u5f00\u53d1\u5de5\u5177\u5305\uff09\uff0c\u6bd4\u5982\u5e38\u89c1\u7684\u73af\u4fe1\u5373\u65f6\u901a\u8baf\u670d\u52a1\u3001\u98de\u4e66\u5f00\u653e\u670d\u52a1\u3001\u5fae\u4fe1\u5f00\u653e\u670d\u52a1\u7b49\u90fd\u662f\u57fa\u4e8e SDK \u6765\u8ba9\u5f00\u53d1\u8005\u8c03\u7528\u548c\u63a5\u5165\u7684\u3002\u90a3\u4e48\u5982\u4f55\u628a\u6211\u4eec\u81ea\u5df1\u5199\u7684 HTTP \u670d\u52a1\u8f6c\u6362\u6210 OpenAPI \u7684\u6807\u51c6\u683c\u5f0f\uff0c\u518d\u5305\u88c5\u6210\u4fbf\u6377\u7684 SDK \u5462\uff1f\u6700\u8fd1\u6211\u57fa\u4e8e Swagger \u548c OpenAPI Generator \u4e24\u4e2a\u5229\u5668\u8fdb\u884c\u4e86\u4e00\u4e9b\u5b9e\u8df5\u3002<\/p>\n<h3>Swagger<\/h3>\n<p>\u968f\u7740\u524d\u540e\u7aef\u5206\u79bb\u5f00\u53d1\u6a21\u5f0f\u7684\u666e\u53ca\uff0c\u524d\u7aef\u5df2\u7ecf\u5168\u6743\u627f\u62c5\u4e86\u9759\u6001\u8d44\u6e90\u7684\u7ba1\u7406\uff0c\u800c\u540e\u7aef\u4e5f\u53ea\u7528\u4e13\u5fc3\u4e8e\u63d0\u4f9b\u63a5\u53e3\uff0c\u524d\u540e\u7aef\u4e4b\u95f4\u901a\u8fc7\u4f20\u8f93\u8f7d\u4f53\uff08\u901a\u5e38\u4e3a JSON\uff09\u8fdb\u884c\u4ea4\u4e92\u3002\u65e2\u7136\u9700\u8981\u4ea4\u4e92\uff0c\u90a3\u4e48\u524d\u7aef\u5fc5\u7136\u9700\u8981\u77e5\u9053\u540e\u7aef\u7684\u63a5\u53e3\u5730\u5740\u3001\u5165\u53c2\u3001\u51fa\u53c2\u3001\u53c2\u6570\u4f4d\u7f6e\u7b49\u5b9a\u4e49\uff0c\u624d\u80fd\u51c6\u786e\u5305\u88c5\u597d\u8bf7\u6c42\u4f53\uff08\u901a\u5e38\u4e3a HTTP\uff09\u3002<\/p>\n<p>\u90a3\u540e\u7aef\u5982\u4f55\u63d0\u4f9b\u63a5\u53e3\u5b9a\u4e49\u5462\uff1f\u5e38\u7528\u7684\u65b9\u5f0f\u53ef\u4ee5\u901a\u8fc7\u5199\u6587\u6863 \u6216 Swagger UI\u3002\u5199\u6587\u6863\u7684\u65b9\u5f0f\u6bd4\u8f83\u673a\u68b0\uff0c\u5982\u679c\u4ee3\u7801\u91cc\u7684\u63a5\u53e3\u5b9a\u4e49\u53d1\u751f\u4fee\u6539\uff0c\u5219\u8981\u540c\u6b65\u8bb0\u5f97\u66f4\u6539\u6587\u6863\u3002\u76f8\u6bd4\u4e4b\u4e0b Swagger \u4f1a\u53cb\u597d\u5f97\u591a\uff0cSwagger \u662f\u4e00\u4e2a\u53ef\u4ee5\u751f\u6210\u3001\u63cf\u8ff0\u3001\u8c03\u7528\u3001\u53ef\u89c6\u5316 Restful \u98ce\u683c\u670d\u52a1\u7684\u6846\u67b6\uff0c\u5b83\u91cc\u9762\u7684\u7ec4\u4ef6\u5f88\u591a\uff0c\u4f46\u6211\u4eec\u6700\u5e38\u7528\u5230\u7684\uff0c\u5c31\u662f\u5728\u6211\u4eec\u7684\u4ee3\u7801\u91cc\u9762\u5f15\u5165 Swagger \u7684\u5e93\u6216\u8005\u63d2\u4ef6\uff0c\u7136\u540e\u901a\u8fc7\u5728 HTTP \u670d\u52a1\u4e0a\u6253\u6ce8\u89e3\uff08\u6216\u5199\u6ce8\u91ca\uff09\uff0c\u7136\u540e\u4e00\u952e\u751f\u6210 swagger.json \u6587\u6863\uff0c\u8be5\u6587\u6863\u662f\u7b26\u5408 OpenAPI \u89c4\u8303\u7684\uff0c\u5e76\u4e14\u4f1a\u542f\u52a8 Swagger UI \u670d\u52a1\uff0c\u63d0\u4f9b\u53ef\u89c6\u5316\u7684\u9875\u9762\u4f9b\u524d\u7aef\u67e5\u770b\u3002\u4e0b\u9762\u662f\u4f7f\u7528 Golang \u8bed\u8a00\u63d0\u4f9b\u7684\u4e00\u4e2a HTTP \u670d\u52a1\uff0c\u670d\u52a1\u4e0a\u65b9\u88ab\u6253\u4e0a\u4e86 Swagger \u53ef\u4ee5\u8bc6\u522b\u7684\u6ce8\u91ca\uff0c\u5e76\u5f15\u5165\u4e86 github.com\/swaggo\/gin-swagger \u5e93\u6765\u751f\u6210 Swagger \u6587\u6863\u548c\u9875\u9762\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\">import (\r\n   \"demo\/request\"\r\n   \"demo\/response\"\r\n)\r\n\r\n\/\/ @Summary    \u521b\u5efa\u7528\u6237\r\n\/\/ @Users      user\r\n\/\/ @Accept     json\r\n\/\/ @Produce    json\r\n\/\/ @Param      object      body        request.CreateUserRequest    true  \"\u521b\u5efa\u7528\u6237\u53c2\u6570\"\r\n\/\/ @Success    200         {object}    response.Response[CreateUserResponse]\r\n\/\/ @Router     \/users      [post]\r\nfunc (h *UserHandler) Create(ctx *gin.Context) {\r\n    \/\/ parse request \r\n    ...\r\n    \/\/ validate request\r\n    ...\r\n    \/\/ invoke service\r\n    ... \r\n    \/\/ return response\r\n    ...\r\n}<\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u53ea\u9700\u5411 gin \u670d\u52a1\u7684\u5165\u53e3\u51fd\u6570\u4e0a\u5199\u4e0a\u8fd9\u4e2a HTTP \u63a5\u53e3\u7684\u5b9a\u4e49\u5373\u53ef\uff0c\u9700\u8981\u8bf4\u660e\u7684\u662f @Param \u548c @Success \u7531\u4e8e\u7528\u5230\u4e86 request \u548c response \u5305\u4e0b\u7684\u7ed3\u6784\u4f53\uff0cSwagger \u8981\u6c42\u5fc5\u987b\u5f15\u5165\u8fd9\u4e9b\u7ed3\u6784\u4f53\u6240\u5728\u7684\u5305\u624d\u80fd\u5b8c\u6210\u89e3\u6790\u3002CreateUserRequest, CreateUserResponse, Response \u7ed3\u6784\u4f53\u7684\u5b9a\u4e49\u5982\u4e0b\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\">package request\r\n\r\ntype CreateUserRequest struct {\r\n   Username string `json:\"Username\"`\r\n   Password string `json:\"Password\"`\r\n   Role     string `json:\"Role\"`\r\n}<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\">package response\r\n\r\ntype Response[T any] struct {\r\n    Code    int     `json:\"Code\"`\r\n    Message string  `json:\"Message\"`\r\n    Data    T       `json:\"Data\"`\r\n}\r\n\r\ntype CreateUserResponse struct { \r\n    UserId string `json:\"UserId\"`\r\n    Status int    `json:\"Status\"`\r\n}<\/pre>\n<p>\u9700\u8981\u8bf4\u660e\u7684\u662f\uff0c\u56e0\u4e3a\u6bcf\u4e2a\u54cd\u5e94\u7ed3\u679c\u9664\u4e86\u8981\u8fd4\u56de\u6570\u636e\u672c\u8eab\uff0c\u5f80\u5f80\u8fd8\u8981\u8fd4\u56de Code \u548c Message \u6807\u8bc6\u672c\u6b21\u8bf7\u6c42\u5728\u4e1a\u52a1\u8bed\u4e49\u4e0a\u7ed3\u679c\uff0c\u56e0\u6b64\u8fd9\u91cc\u5f15\u5165\u4e86 Response[T any] \u6cdb\u578b\u7c7b\u8fdb\u884c\u88c5\u9970\uff0c\u90a3\u4e48\u76f8\u5e94\u7684\uff0c\u4e0a\u9762 Swagger \u6ce8\u91ca\u4e5f\u9700\u8981\u5199\u6210\u8fd9\u6837 response.Response[CreateUserResponse]\u3002\u6700\u540e\u6211\u4eec\u8fd8\u9700\u8981\u4f7f\u7528\u5b89\u88c5\u547d\u4ee4 swag \u547d\u4ee4\u884c\u5de5\u5177\u6765\u751f\u6210 Swagger \u6587\u6863\uff0c\u50cf\u4e0b\u9762\u8fd9\u6837\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\"># install\r\ngo get -u github.com\/swaggo\/swag\/cmd\/swag\r\ngo install github.com\/swaggo\/swag\/cmd\/swag@latest\r\n\r\n# copy swag from $GOPATH to \/usr\/local\/bin\r\ncp $GOPATH\/bin\/swag \/usr\/local\/bin\r\n\r\n# generate swagger.json\r\nswag init -g .\/cmd\/server\/main.go -o .\/cmd\/server\/doc --parseDependency<\/pre>\n<p>\u6267\u884c\u5b8c\u4e0a\u9762\u751f\u6210\u547d\u4ee4\u540e\uff0cswagger.json \u4fbf\u4f1a\u51fa\u73b0\u5728\u6211\u4eec\u7684\u76ee\u5f55\u4e0b\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">.\r\n\u251c\u2500\u2500 cmd                    \r\n\u2502 \u251c\u2500\u2500 server           \r\n\u2502 \u2502 \u251c\u2500\u2500 docs              \r\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 docs.go  \r\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 swagger.yaml           \r\n\u2502 \u2502 \u2502 \u2514\u2500\u2500 swagger.json      \r\n\u2502 \u2502 \u2514\u2500\u2500 main.go\r\n...<\/pre>\n<p>gin-swagger \u6ce8\u91ca\u7684\u8bed\u6cd5\u8fd8\u6709\u5f88\u591a\uff0c\u4ee5\u53ca\u5982\u4f55\u63d0\u4f9b Swagger UI \u9759\u6001\u9875\u9762\u670d\u52a1\uff0c\u90fd\u53ef\u4ee5<a href=\"https:\/\/github.com\/swaggo\/gin-swagger\"><span style=\"color: #7cc576;\">\u53c2\u8003\u8fd9\u91cc<\/span><\/a>\uff0c\u672c\u6587\u4e0d\u518d\u8d58\u8ff0\u3002<\/p>\n<h3>OpenAPI Generator<\/h3>\n<p>\u5176\u5b9e\u4ee5\u524d\u6211\u7528 Swagger \u4e5f\u5c31\u5230\u4e0a\u9762\u4e3a\u6b62\u4e86\uff0c\u66f4\u591a\u7684\u662f\u53bb\u4f7f\u7528 Swagger UI \u67e5\u770b\u63a5\u53e3\uff0c\u81f3\u4e8e swagger.json \u4e3a\u4f55\u7269\u5b8c\u5168\u4e0d\u5173\u5fc3\uff0c\u53e6\u5916\u5982\u679c\u8981\u8c03\u7528 HTTP \u63a5\u53e3\uff0c\u76f4\u63a5\u57fa\u4e8e HTTP \u901a\u4fe1\u5e93\u586b\u597dURL \u5730\u5740\u3001Header\u3001\u5165\u53c2\u3001\u4ee4\u724c\u5c31\u597d\u4e86\uff0c\u4e3a\u4ec0\u4e48\u8fd8\u9700\u8981 SDK \u5462\uff1f\u5176\u5b9e\u76f4\u63a5\u8c03\u7528 HTTP \u901a\u4fe1\u5e93\u4e00\u70b9\u95ee\u9898\u90fd\u6ca1\u6709\uff0c\u4f46\u8fd9\u6837\u4f1a\u589e\u5927\u63a5\u5165\u65b9\u7684\u7814\u53d1\u6210\u672c\uff0c\u4ed6\u9700\u8981\u624b\u5de5\u62fc\u63a5\u597d\u63a5\u53e3\u7684\u53c2\u6570\uff0c\u5b57\u6bb5\u8fd8\u4e0d\u80fd\u6709\u62fc\u5199\u9519\u8bef\uff0c\u53e6\u5916\u5982\u679c\u53c2\u6570\u6709\u7b7e\u540d\u8fd8\u8981\u5173\u5fc3\u7528\u4ec0\u4e48\u7b7e\u540d\u7b97\u6cd5\uff0c\u56e0\u6b64 SDK \u5c31\u662f\u4e3a\u4e86\u7ed9\u63a5\u5165\u65b9\u51cf\u8d1f\u51fa\u73b0\u7684\uff0c\u56e0\u4e3a\u5b83\u4e0d\u518d\u8981\u6c42\u63a5\u5165\u65b9\u5173\u6ce8\u8fc7\u591a\u7ec6\u8282\uff0c\u800c\u901a\u8fc7\u7f16\u7a0b\u8bed\u8a00\u7684\u51fd\u6570\u5c01\u88c5\u3001\u51fd\u6570\u7b7e\u540d\u3001\u7ed3\u6784\u4f53\/\u7c7b\u90fd\u7ea6\u675f\u597d\u4e86\uff0c\u5982\u679c\u5f00\u53d1\u8005\u63a5\u53e3\u6216\u8005\u5b57\u6bb5\u62fc\u5199\u6709\u9519\u8bef\uff0c\u90a3\u4e48\u5728\u7a0b\u5e8f\u7f16\u8bd1\u7684\u65f6\u5019\u5c31\u4f1a\u62a5\u51fa\u6765\uff0c\u98ce\u9669\u76f8\u5f53\u4e8e\u4ece\u670d\u52a1\u5668\u7aef\u4e0a\u79fb\u5230\u5ba2\u6237\u7aef\u4e86\u3002<\/p>\n<p>\u90a3\u6211\u4eec\u5982\u4f55\u624d\u80fd\u66f4\u65b9\u4fbf\u7684\u751f\u6210 SDK \u5462\uff1f\u4e0a\u9762\u63d0\u5230\u7684 swagger.json \u5c31\u5f88\u91cd\u8981\u4e86\uff0c\u6b63\u56e0\u4e3a\u5b83\u662f\u9075\u5faa\u6807\u51c6\u7684 OpenAPI \u89c4\u8303\u751f\u6210\u7684\uff0c\u56e0\u6b64\u53ea\u8981\u5c06\u8fd9\u4efd\u6587\u6863\u4f5c\u4e3a\u8f93\u5165\uff0c\u4f20\u9012\u7ed9 OpenAPI Generator \u5de5\u5177\uff0c\u4fbf\u53ef\u4ee5\u751f\u6210\u5404\u79cd\u8bed\u8a00\u7684 SDK \u4ee3\u7801\u4e86! \u8fd9\u6216\u8bb8\u5c31\u662f\u5236\u5b9a\u6807\u51c6\u548c\u89c4\u8303\u7684\u4f1f\u5927\u4e4b\u5904\u5427\uff0c\u80fd\u591f\u8ba9\u540c\u6837\u7684\u6570\u636e\u5728\u591a\u79cd\u4e0d\u540c\u7ec4\u7ec7\u5f00\u53d1\u7684\u7ec4\u4ef6\u95f4\u5171\u4eab\uff0c\u6700\u540e\u5f62\u6210\u4e00\u79cd\u751f\u6001\u3002<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2649\" src=\"http:\/\/yaochenkun.site\/wp-content\/uploads\/2023\/11\/sdk.png\" alt=\"\" width=\"994\" height=\"178\" \/><\/p>\n<p>OpenAPI Generator \u53ef\u4ee5\u7b80\u5355\u7406\u89e3\u4e3a\u5c31\u662f\u4e00\u4e2a\u53ef\u4ee5\u57fa\u4e8e\u6807\u51c6\u7684 OpenAPI \u63cf\u8ff0\u6587\u6863\u751f\u6210\u591a\u8bed\u8a00 SDK \u7684\u5de5\u5177\uff0c\u5b83\u57fa\u4e8e Swagger Codegen \u5e76\u4e14\u529f\u80fd\u65b9\u9762\u66f4\u4e3a\u4e30\u5bcc\u5f3a\u5927\u3002OpenAPI Generator \u7684\u5b89\u88c5\u65b9\u5f0f\u6709\u5f88\u591a\u79cd\uff0c<span style=\"color: #7cc576;\"><a style=\"color: #7cc576;\" href=\"https:\/\/openapi-generator.tech\/docs\/installation\">\u5b98\u65b9\u6587\u6863<\/a><\/span>\u6709\u975e\u5e38\u8be6\u7ec6\u7684\u8bf4\u660e\u3002\u5b89\u88c5\u597d\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u50cf\u4e0b\u9762\u8fd9\u6837\u4ece\u4e00\u4efd swagger.json \u6587\u4ef6\u5bfc\u51fa SDK \u5566~<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">openapi-generator generate \\\r\n    -i swagger.json \\  # \u8f93\u5165\u6587\u4ef6\r\n    -g go \\            # \u7f16\u7a0b\u8bed\u8a00\r\n    -o sdk\/            # \u8f93\u51fa\u76ee\u5f55<\/pre>\n<p>OpenAPI Generator \u9ed8\u8ba4\u751f\u6210\u7684 SDK \u91cc\u5305\u542b\u7684\u4e00\u4e9b\u547d\u540d\u6709\u7684\u5730\u65b9\u4f1a\u6bd4\u8f83\u5947\u602a\uff0c\u6bd4\u5982\u7528\u5305\u540d+\u4e0b\u5212\u7ebf\u62fc\u63a5\u6210\u7684\u6587\u4ef6\u540d\uff0c\u7136\u540e\u6587\u4ef6\u90fd\u662f\u5e73\u94fa\u5f00\u7684\u6ca1\u6709\u5212\u5206\u76ee\u5f55\uff0c\u4f46\u8fd9\u4e9b\u90fd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539\u5bf9\u5e94\u8bed\u8a00\u7684\u9ed8\u8ba4\u6a21\u7248\u6765\u5b9a\u5236\u5316\uff0c\u5b98\u65b9\u6587\u6863\u540c\u6837\u6709\u5f88\u591a\u4ecb\u7ecd\uff0c\u672c\u6587\u4e0d\u505a\u8d58\u8ff0\u3002<\/p>\n<h3>\u4f7f\u7528 SDK<\/h3>\n<p>\u6709\u4e86\u4e0a\u9762\u5bfc\u51fa\u7684 SDK\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u50cf\u4e0b\u9762\u8fd9\u6837\u5728\u5ba2\u6237\u7aef\u5f15\u5165\u5b83\u7136\u540e\u65b9\u4fbf\u5730\u8fdb\u884c\u8c03\u7528\u5566~ \u4e0b\u9762\u662f\u4e00\u4e2a Golang SDK \u7684\u793a\u4f8b\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\">func ListUsers() error {\r\n    \/\/ \u5b9a\u4e49\u914d\u7f6e\r\n    config := openapi.NewConfiguration()\r\n    config.Host = \"my-service.com:9090\"\r\n    config.Scheme = \"http\"\r\n    config.AddDefaultHeader(\"caller-uid\", \"admin\")\r\n    config.AddDefaultHeader(\"caller-token\", \"18a87dfs12sdf9381aww0f2383\")\r\n    \/\/ \u521b\u5efa\u5ba2\u6237\u7aef\u5bf9\u8c61\r\n    apiClient = openapi.NewAPIClient(config)\r\n    \/\/ \u8c03\u7528\u670d\u52a1\r\n    bizResponse, httpResponse, err := apiClient.UserApi.UsersGetExecute(openapi.ApiUsersGetRequest{\r\n        Role: \"normal-user\",\r\n        Status: \"Logined\",\r\n    })\r\n    if err != nil {\r\n       return err\r\n    }\r\n    if httpResponse == nil || httpResponse.Status != \"200 OK\" {\r\n       return fmt.Errorf(\"error occurred\")\r\n    }\r\n    \/\/ \u6253\u5370\u8c03\u7528\u7ed3\u679c\r\n    fmt.Println(bizResponse)\r\n}\r\n\r\n\/\/bizResponse:\r\n\/\/{\r\n\/\/   Code: 0,\r\n\/\/   Message: \"success\",\r\n\/\/   Data: {\r\n\/\/      TotalCount: 20,\r\n\/\/      Users: [{\r\n\/\/         Id: 1,\r\n\/\/         Name: \"alice\",\r\n\/\/         Role: \"normal-user\",\r\n\/\/         Status: \"Logined\"\r\n\/\/      }, {\r\n\/\/         Id: 1,\r\n\/\/         Name: \"bob\",\r\n\/\/         Role: \"normal-user\",\r\n\/\/         Status: \"Logined\"\r\n\/\/      }]\r\n\/\/   }\r\n\/\/}\r\n<\/pre>\n<h3>\u7ed3\u8bed<\/h3>\n<p>\u4e0a\u9762\u4fbf\u662f\u4ece\u670d\u52a1\u5668\u7aef\u4ee3\u7801\u5230\u6700\u7ec8\u591a\u8bed\u8a00\u7684 SDK \u7684\u751f\u6210\u8def\u5f84\uff0c\u603b\u7ed3\u8d77\u6765\u5c31\u662f\u4e0b\u9762\u8fd9\u6837\uff1a<\/p>\n<ol>\n<li>\u4e3a\u670d\u52a1\u7aef\u4ee3\u7801\u7684 HTTP \u65b9\u6cd5\u52a0\u4e0a Swagger \u6ce8\u91ca<\/li>\n<li>\u7531 swag \u5de5\u5177\u751f\u6210 swagger.json \u6587\u6863<\/li>\n<li>\u5c06 swagger.json \u4f5c\u4e3a\u8f93\u5165\u53c2\u6570\u4f20\u9012\u7ed9 openapi-generator \u5de5\u5177\u751f\u6210\u5bf9\u5e94\u8bed\u8a00\u7684 SDK<\/li>\n<\/ol>\n<p>\u53ef\u4ee5\u770b\u51fa\uff0c\u8981\u60f3\u83b7\u5f97\u4e00\u4efd OpenAPI SDK\uff0c\u6211\u4eec\u4e0d\u518d\u9700\u8981\u624b\u5de5\u7f16\u5199\u7e41\u7410\u7684\u8bf7\u6c42\u53d1\u9001\u548c\u89e3\u6790\u903b\u8f91\uff0c\u53ea\u7528\u6309\u7167 Swagger \u6ce8\u91ca\u89c4\u8303\u586b\u5199\u597d\u63a5\u53e3\u7684\u7b7e\u540d\u4fe1\u606f\u5373\u53ef~ \u8fd9\u79cd\u65b9\u5f0f\u5c06 SDK \u4e0e\u539f\u59cb\u63a5\u53e3\u76f8\u7ed1\u5b9a\uff0c\u6240\u89c1\u5373\u6240\u5f97\uff0c\u51cf\u5c11\u4e86\u4e24\u4fa7\u5b9a\u4e49\u4e0d\u4e00\u81f4\u7684\u98ce\u9669\u51fa\u73b0\uff0c\u5bfc\u51fa SDK \u66f4\u52a0\u5feb\u901f\u9ad8\u6548\uff0c\u53c8\u9075\u5faa\u4e86\u6807\u51c6\u7684 OpenAPI \u89c4\u8303\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f15\u8a00 \u4e3a\u4e86\u5c06\u81ea\u5df1\u7684\u670d\u52a1\u63d0\u4f9b\u51fa\u53bb\u4f9b\u7b2c\u4e09\u65b9\u4f7f\u7528\uff0c\u5f80\u5f80\u9700\u8981\u628a\u670d\u52a1\u4ee5\u6807\u51c6\u7684 OpenAPI \u5f62\u5f0f\u66b4\u9732\uff0c\u5e76\u63d0\u4f9b\u591a\u8bed\u8a00\u7248\u672c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66,43,57],"tags":[],"_links":{"self":[{"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/posts\/2612"}],"collection":[{"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/comments?post=2612"}],"version-history":[{"count":33,"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/posts\/2612\/revisions"}],"predecessor-version":[{"id":3158,"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/posts\/2612\/revisions\/3158"}],"wp:attachment":[{"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/media?parent=2612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/categories?post=2612"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yaochenkun.site\/index.php\/wp-json\/wp\/v2\/tags?post=2612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}