{"id":523,"date":"2020-06-15T18:55:19","date_gmt":"2020-06-15T11:55:19","guid":{"rendered":"https:\/\/www.marketenterprise.vn\/blog\/?p=523"},"modified":"2021-12-27T19:29:18","modified_gmt":"2021-12-27T12:29:18","slug":"swagger-api-development-for-everyone","status":"publish","type":"post","link":"https:\/\/www.marketenterprise.vn\/blog\/swagger-api-development-for-everyone.html","title":{"rendered":"Swagger API Development for Everyone"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><br \/>\u0110\u1eb7t v\u1ea5n \u0111\u1ec1<\/h2>\n\n\n\n<p>Tr\u01b0\u1edbc khi \u0111i v\u00e0o kh\u00e1i ni\u1ec7m v\u00e0 t\u00e1c d\u1ee5ng c\u1ee7a Swagger. MEVN s\u1ebd \u0111\u1eb7t m\u1ed9t tr\u01b0\u1eddng h\u1ee3p \u0111\u1ec3 gi\u00fap b\u1ea1n hi\u1ec3u r\u00f5 h\u01a1n v\u1ec1 Swagger.<\/p>\n\n\n\n<p>Gi\u1ea3 s\u1eed c\u00f3 hai nh\u00f3m \u0111ang th\u1ef1c hi\u1ec7n c\u00f9ng m\u1ed9t d\u1ef1 \u00e1n. V\u00e0 c\u1ea3 hai ph\u1ea3i c\u00f9ng chia s\u1ebb th\u00f4ng tin, t\u00e0i li\u1ec7u cho nhau m\u1edbi c\u00f3 th\u1ec3 ho\u00e0n th\u00e0nh \u0111\u01b0\u1ee3c d\u1ef1 \u00e1n. V\u1eady l\u00e0m c\u00e1ch n\u00e0o \u0111\u1ec3 gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 n\u00e0y?<br><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">H\u01b0\u1edbng gi\u1ea3i quy\u1ebft th\u00f4ng th\u01b0\u1eddng<\/h2>\n\n\n\n<p>V\u1ea5n \u0111\u1ec1 n\u00e0y th\u1ef1c s\u1ef1 r\u1ea5t \u0111\u01a1n gi\u1ea3n ph\u1ea3i kh\u00f4ng? Ch\u1ec9 m\u1ed9t file document. File n\u00e0y s\u1ebd \u0111\u1ea3m nhi\u1ec7m vi\u1ec7c l\u01b0u c\u00e1c th\u00f4ng tin t\u00e0i li\u1ec7u v\u00e0 ch\u1ec9 m\u1ed9t ph\u00e1t nh\u1ea5p chu\u1ed9t l\u00e0 \u0111\u00e3 c\u00f3 nh\u1eefng th\u00f4ng tin, t\u00e0i li\u1ec7u c\u1ea7n thi\u1ebft.<br><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">H\u01b0\u1edbng gi\u1ea3i quy\u1ebft trong l\u1eadp tr\u00ecnh<\/h2>\n\n\n\n<p>Ngay c\u1ea3 trong l\u1eadp tr\u00ecnh, ph\u01b0\u01a1ng ph\u00e1p n\u00e0y c\u0169ng \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng. Khi c\u1ea7n truy\u1ec1n th\u00f4ng tin v\u00e0 d\u1eef li\u1ec7u cho nhau h\u1ecd s\u1ebd c\u1ea7n t\u1ea1o APIs. Sau \u0111\u00f3 \u0111\u01b0a c\u00e1c m\u00f4 t\u1ea3 chi ti\u1ebft c\u1ee7a api v\u00e0o m\u1ed9t file document hay c\u00f3 c\u00e1ch g\u1ecdi kh\u00e1c l\u00e0 file <strong>OpenAPI<\/strong>. Nh\u00f3m kia s\u1ebd d\u1ef1a v\u00e0o c\u00e1c th\u00f4ng tin APIs trong file <strong>OpenAPI <\/strong>\u0111\u1ec3 nh\u1eadn d\u1eef li\u1ec7u c\u1ea7n d\u00f9ng.<br><br><\/p>\n\n\n\n<p>V\u1eady c\u00e2u h\u1ecfi \u0111\u01b0\u1ee3c \u0111\u1eb7t ra l\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 \u0111\u1ed1i t\u00e1c bi\u1ebft b\u1ea1n \u0111ang cung c\u1ea5p nh\u1eefng t\u00e0i nguy\u00ean g\u00ec, l\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 l\u1ea5y \u0111\u01b0\u1ee3c t\u00e0i nguy\u00ean \u0111\u00f3 v\u00e0 xem \u0111\u01b0\u1ee3c nh\u1eefng t\u00e0i nguy\u00ean c\u00f3 \u0111\u00fang nh\u01b0 nhu c\u1ea7u c\u1ee7a h\u1ecd kh\u00f4ng? V\u00ec th\u1ebf c\u00f4ng c\u1ee5 Swagger \u0111\u01b0\u1ee3c sinh ra.<br><br><\/p>\n\n\n\n<p>V\u1eady Swagger l\u00e0 g\u00ec? V\u00e0 n\u00f3 gi\u00fap b\u1ea1n gi\u1ea3i quy\u1ebft c\u00e1c v\u1ea5n \u0111\u1ec1 tr\u00ean nh\u01b0 th\u1ebf n\u00e0o?<\/p>\n\n\n\n<p><strong>Swagger l\u00e0 g\u00ec?<\/strong> Swagger<strong> <\/strong>l\u00e0 m\u1ed9t b\u1ed9 c\u00e1c c\u00f4ng c\u1ee5 open-source \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng xung quanh OpenAPI<strong> <\/strong>Specification. OpenAPI<strong> <\/strong>Specification l\u00e0 m\u1ed9t d\u1ea1ng m\u00f4 t\u1ea3 chi ti\u1ebft APIs cho REST APIs. B\u1ea1n c\u00f3 th\u1ec3 hi\u1ec3u REST APIs l\u00e0 m\u1ed9t ti\u00eau chu\u1ea9n d\u00f9ng trong vi\u1ec7c thi\u1ebft k\u1ebf c\u00e1c thi\u1ebft k\u1ebf API cho c\u00e1c \u1ee9ng d\u1ee5ng web. Khi d\u00f9ng OpenAPI<strong> <\/strong>Specification t\u00e0i li\u1ec7u c\u1ee7a b\u1ea1n s\u1ebd hi\u1ec3n th\u1ecb \u1edf \u0111\u1ecbnh d\u1ea1ng g\u1ecdn g\u00e0ng, d\u1ec5 \u0111\u1ecdc.<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"988\" height=\"561\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173914\/pasted-image-0-8.png\" alt=\"\" class=\"wp-image-525\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173914\/pasted-image-0-8.png 988w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173914\/pasted-image-0-8-300x170.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173914\/pasted-image-0-8-768x436.png 768w\" sizes=\"auto, (max-width: 988px) 100vw, 988px\" \/><\/figure>\n\n\n\n<p><br>\u0110\u1ec3 thu\u1eadn ti\u1ec7n h\u01a1n cho b\u1ea1n design, build, t\u1ea1o document v\u00e0 d\u00f9ng REST APIs Swagger \u0111\u00e3 chia th\u00e0nh c\u00e1c c\u00f4ng c\u1ee5 kh\u00e1c nhau:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/editor.swagger.io\/\" target=\"_blank\" rel=\"noopener\">Swagger Editor<\/a> \u2013 tr\u00ecnh ch\u1ec9nh s\u1eeda tr\u00ean tr\u00ecnh duy\u1ec7t. B\u1ea1n c\u00f3 th\u1ec3 vi\u1ebft th\u00f4ng s\u1ed1 k\u1ef9 thu\u1eadt c\u1ee7a m\u1ed9t file OpenAPI t\u1ea1i \u0111\u00e2y.<\/li><li><a href=\"https:\/\/swagger.io\/swagger-ui\/\" target=\"_blank\" rel=\"noopener\">Swagger UI<\/a> \u2013 hi\u1ec3n th\u1ecb th\u00f4ng s\u1ed1 k\u1ef9 thu\u1eadt OpenAPI d\u01b0\u1edbi d\u1ea1ng t\u00e0i li\u1ec7u API t\u01b0\u01a1ng t\u00e1c. Cho ph\u00e9p b\u1ea5t c\u1ee9 ai nh\u00f3m ph\u00e1t tri\u1ec3n ho\u1eb7c \u0111\u1ed1i t\u00e1c ng\u01b0\u1eddi ti\u00eau d\u00f9ng &#8211; t\u01b0\u01a1ng t\u00e1c tr\u1ef1c ti\u1ebfp v\u1edbi c\u00e1c t\u00e0i nguy\u00ean API c\u1ee7a b\u1ea1n m\u00e0 kh\u00f4ng c\u1ea7n b\u1ea5t c\u1ee9 logic tri\u1ec3n khai n\u00e0o.<\/li><li><a href=\"https:\/\/github.com\/swagger-api\/swagger-codegen\" target=\"_blank\" rel=\"noopener\">Swagger Codegen<\/a> \u2013 t\u1ea1o server c\u01a1 b\u1ea3n v\u00e0 th\u01b0 vi\u1ec7n client t\u1eeb m\u1ed9t OpenAPI<strong> <\/strong>Specification. C\u00f4ng c\u1ee5 cung c\u1ea5p h\u01a1n 40 ng\u00f4n ng\u1eef \u0111\u1ec3 b\u1ea1n l\u1ef1a ch\u1ecdn.<\/li><li><a href=\"https:\/\/github.com\/swagger-api\/swagger-codegen\" target=\"_blank\" rel=\"noopener\">Swagger<\/a> Hub \u2013 c\u00f3 \u0111\u1ea7y \u0111\u1ee7 c\u1ea3 3 c\u00f4ng c\u1ee5 ph\u00eda tr\u00ean v\u00e0 cung c\u1ea5p m\u1ed9t domain cho ph\u00e9p ch\u00fang ta public Swagger UI. T\u1ea5t nhi\u00ean d\u1ecbch v\u1ee5 n\u00e0y c\u00f3 t\u00ednh ph\u00ed nh\u01b0ng b\u1ea1n v\u1eabn c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng b\u1ea3n free trial.<br><br><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">S\u1eed d\u1ee5ng Swagger?<\/h2>\n\n\n\n<p>\u0110\u1ec3 s\u1eed d\u1ee5ng Swagger b\u1ea1n c\u00f3 th\u1ec3 t\u1ea3i v\u1ec1 v\u00e0 ch\u1ea1y \u1edf local. Tuy nhi\u00ean \u0111\u00e2y MEVN s\u1ebd h\u01b0\u1edbng d\u1eabn b\u1ea1n s\u1eed d\u1ee5ng online tr\u00ean website <a href=\"https:\/\/app.swaggerhub.com\/login\" target=\"_blank\" rel=\"noopener\">Swagger Hub<\/a>.Sau khi \u0111\u0103ng k\u00fd t\u00e0i kho\u1ea3n tr\u00ean <a href=\"https:\/\/app.swaggerhub.com\/login\" target=\"_blank\" rel=\"noopener\">Swagger Hub<\/a>. <a href=\"https:\/\/app.swaggerhub.com\/login\" target=\"_blank\" rel=\"noopener\">Swagger Hub<\/a> s\u1ebd \u0111\u01b0a b\u1ea1n \u0111\u1ebfn trang t\u1ea1o api. C\u00f3 nhi\u1ec1u m\u1eabu template t\u00f9y v\u00e0o nhu c\u1ea7u m\u00e0 b\u1ea1n c\u00f3 th\u1ec3 l\u1ef1a ch\u1ecdn theo \u00fd mu\u1ed1n.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"532\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173949\/pasted-image-0-2-1-1024x532.png\" alt=\"\" class=\"wp-image-526\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173949\/pasted-image-0-2-1-1024x532.png 1024w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173949\/pasted-image-0-2-1-300x156.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173949\/pasted-image-0-2-1-768x399.png 768w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173949\/pasted-image-0-2-1-1536x798.png 1536w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173949\/pasted-image-0-2-1-1568x814.png 1568w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15173949\/pasted-image-0-2-1.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><br><br>Khi t\u1ea1o th\u00e0nh c\u00f4ng api b\u1ea1n s\u1ebd \u0111\u01b0\u1ee3c \u0111\u01b0a \u0111\u1ebfn m\u1ed9t trang editor v\u1edbi \u0111\u1ecbnh d\u1ea1ng file .yaml.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"532\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174105\/pasted-image-0-3-1-1024x532.png\" alt=\"\" class=\"wp-image-527\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174105\/pasted-image-0-3-1-1024x532.png 1024w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174105\/pasted-image-0-3-1-300x156.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174105\/pasted-image-0-3-1-768x399.png 768w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174105\/pasted-image-0-3-1-1536x798.png 1536w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174105\/pasted-image-0-3-1-1568x814.png 1568w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174105\/pasted-image-0-3-1.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><br>Giao di\u1ec7n trang \u0111\u01b0\u1ee3c chia th\u00e0nh 3 ph\u1ea7n.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Navigation: c\u1ed9t b\u00ean tr\u00e1i\u00a0<\/strong><\/h3>\n\n\n\n<p>Thanh menu \u0111\u01b0\u1ee3c t\u1ea1o t\u1eeb n\u1ed9i dung c\u1ee7a file .yaml. T\u1ea1i \u0111\u00e2y n\u1ed9i dung file \u0111\u01b0\u1ee3c ph\u00e2n theo t\u1eebng m\u1ee5c. B\u1ea1n c\u00f3 th\u1ec3 d\u00f9ng n\u00f3 \u0111\u1ec3 \u0111i\u1ec1u h\u01b0\u1edbng \u0111\u1ebfn ph\u1ea7n n\u1ed9i dung c\u1ea7n xem.<br><br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Editor: c\u1ed9t \u1edf gi\u1eefa<\/strong><\/h3>\n\n\n\n<p>Khung editor s\u1ebd hi\u1ec3n th\u1ecb n\u1ed9i dung file .yaml v\u00e0 MEVN s\u1ebd gi\u1edbi thi\u1ec7u \u0111\u00f4i ch\u00fat v\u1ec1 c\u00e1c key trong file n\u00e0y.<br><br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Info<\/h3>\n\n\n\n<p>M\u1ed7i OpenAPI specifications s\u1ebd b\u1eaft \u0111\u1ea7u v\u1edbi t\u1eeb kh\u00f3a openapi \u0111\u1ec3 khai b\u00e1o phi\u00ean b\u1ea3n (VD: openapi: 3.0.0). Phi\u00ean b\u1ea3n n\u00e0y s\u1ebd \u0111\u1ecbnh ngh\u0129a to\u00e0n b\u1ed9 c\u1ea5u tr\u00fac c\u1ee7a API Ph\u00e2n info s\u1ebd ch\u1ee9a nh\u1eefng th\u00f4ng tin c\u1ee7a API nh\u01b0: title, description (t\u00f9y ch\u1ecdn), version.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>title: t\u00ean API.<\/li><li>description : th\u00f4ng tin m\u00f4 t\u1ea3 v\u1ec1 API, c\u00f3 th\u1ec3 vi\u1ebft th\u00e0nh nhi\u1ec1u d\u00f2ng &amp; h\u1ed7 tr\u1ee3 c\u00fa ph\u00e1p Markdown.<\/li><li>info : th\u00f4ng tin li\u00ean h\u1ec7, ch\u1ee9ng ch\u1ec9, \u0111i\u1ec1u kho\u1ea3n s\u1eed d\u1ee5ng v\u00e0 nh\u1eefng th\u00f4ng tin kh\u00e1c.<\/li><li>version: phi\u00ean b\u1ea3n API.<br><br><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"821\" height=\"302\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174324\/pasted-image-0-4-2.png\" alt=\"\" class=\"wp-image-528\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174324\/pasted-image-0-4-2.png 821w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174324\/pasted-image-0-4-2-300x110.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15174324\/pasted-image-0-4-2-768x283.png 768w\" sizes=\"auto, (max-width: 821px) 100vw, 821px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Servers<\/h3>\n\n\n\n<p>\u0110\u00e2y l\u00e0 ph\u1ea7n s\u1ebd ch\u1ec9 \u0111\u1ecbnh \u0111\u01b0\u1eddng d\u1eabn c\u1ee7a server \u0111\u1ec3. B\u1ea1n c\u00f3 th\u1ec3 \u0111\u1ecbnh ngh\u0129a m\u1ed9t ho\u1eb7c nhi\u1ec1u server. V\u00e0 MEVN s\u1ebd \u0111\u1ec3 c\u00e1ch d\u00f9ng c\u00e1c \u0111\u01b0\u1eddng d\u1eabn n\u00e0y \u0111\u1ec3 test APIs \u1edf cu\u1ed1i b\u00e0i vi\u1ebft.<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"837\" height=\"97\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180610\/pasted-image-0-5-1.png\" alt=\"\" class=\"wp-image-529\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180610\/pasted-image-0-5-1.png 837w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180610\/pasted-image-0-5-1-300x35.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180610\/pasted-image-0-5-1-768x89.png 768w\" sizes=\"auto, (max-width: 837px) 100vw, 837px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Tags<\/h3>\n\n\n\n<p>\u0110\u1ecbnh ngh\u0129a tags, c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng \u0111\u1ec3 gom nh\u1eefng API trong c\u00f9ng m\u1ed9t controllers v\u1ec1 m\u1ed9t nh\u00f3m.<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"799\" height=\"259\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180650\/pasted-image-0-6-1.png\" alt=\"\" class=\"wp-image-530\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180650\/pasted-image-0-6-1.png 799w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180650\/pasted-image-0-6-1-300x97.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180650\/pasted-image-0-6-1-768x249.png 768w\" sizes=\"auto, (max-width: 799px) 100vw, 799px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Paths<\/h3>\n\n\n\n<p>\u0110\u00e2y l\u00e0 ph\u1ea7n tr\u1ecdng t\u00e2m c\u1ee7a API. \u1ede ph\u1ea7n n\u00e0y b\u1ea1n s\u1ebd \u0111\u1ecbnh ngh\u0129a nh\u1eefng paths trong API c\u1ee7a b\u1ea1n c\u0169ng nh\u01b0 ph\u01b0\u01a1ng th\u1ee9c, tham s\u1ed1 trong API.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>paths trong API (\/user\/{userId}).<br><br><\/li><li>Ph\u01b0\u01a1ng th\u1ee9c c\u1ee7a API (GET, POST, DELETE, PUT \u2026).<br><br><\/li><li>summary l\u00e0 ph\u1ea7n m\u00f4 t\u1ea3 t\u00f3m t\u1eaft c\u1ee7a API.<br><br><\/li><li>parameters: s\u1ebd l\u00e0 nh\u1eefng tham s\u1ed1 truy\u1ec1n v\u00e0o API. B\u1ea1n c\u00f3 th\u1ec3 set tham s\u1ed1 required hay kh\u00f4ng, m\u00f4 t\u1ea3 n\u00f3 (description) ho\u1eb7c validate. \u0110\u1eb7c bi\u1ec7t trong ph\u1ea7n n\u00e0y b\u1ea1n c\u00f3 th\u1ec3 ch\u1ec9 \u0111\u1ecbnh 1 schema (Model) \u0111\u1ec3 c\u00f3 th\u1ec3 \u0111\u1ecbnh ngh\u0129a cho ph\u1ea7n tham s\u1ed1 th\u00f4ng qua schema &amp; $ref.<br><br><\/li><li>response l\u00e0 ph\u1ea7n tr\u1ea3 v\u1ec1 c\u1ee7a server. D\u00f9ng \u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a nh\u1eefng HTTP code: 200, 404, 500 \u2026 v\u1edbi nh\u1eefng m\u00f4 t\u1ea3 cho t\u1eebng tr\u01b0\u1eddng h\u1ee3p.<br><br><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"795\" height=\"540\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180717\/pasted-image-0-7-1.png\" alt=\"\" class=\"wp-image-531\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180717\/pasted-image-0-7-1.png 795w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180717\/pasted-image-0-7-1-300x204.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180717\/pasted-image-0-7-1-768x522.png 768w\" sizes=\"auto, (max-width: 795px) 100vw, 795px\" \/><\/figure>\n\n\n\n<p>C\u00e1c parameters c\u00f3 kh\u00e1 nhi\u1ec1u khai b\u00e1o sau t\u1eeb kh\u00f3a in m\u00e0 b\u1ea1n s\u1ebd ph\u1ea3i ch\u00fa \u00fd \u0111\u1ebfn:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>in: body : t\u1ea1o m\u1ed9t input-text area m\u00e0 \u1edf \u0111\u00f3 b\u1ea1n c\u00f3 th\u1ec3 nh\u1eadp data body request v\u00e0o (s\u1eed d\u1ee5ng cho methods PATH\/ PUT).<br><br><\/li><li>in: formData : t\u1ea1o nh\u1eefng input \u0111\u00e3 \u0111\u1ecbnh tr\u01b0\u1edbc m\u00e0 b\u1ea1n s\u1ebd nh\u1eadp data request theo t\u1eebng field \u0111\u00e3 \u0111\u1ecbnh s\u1eb5n v\u00e0o (s\u1eed d\u1ee5ng cho methods PATH\/ PUT).<br><br><\/li><li>in: path : t\u1ea1o m\u1ed9t input nh\u1eadp v\u00e0o gi\u00e1 tr\u1ecb khai b\u00e1o trong routes, th\u01b0\u1eddng l\u00e0 id.<br><br><\/li><li>in: query : t\u1ea1o m\u1ed9t input nh\u1eadp v\u00e0o gi\u00e1 tr\u1ecb theo c\u00e1c field \u0111\u1ecbnh s\u1eb5n \u0111\u1ec3 g\u1eedi nh\u1eefng query request (s\u1eed d\u1ee5ng trong methods GET).<br><br><\/li><li>in: header : khai b\u00e1o nh\u1eefng gi\u00e1 tr\u1ecb trong header c\u1ee7a request m\u00e0 b\u1ea1n c\u1ea7n truy\u1ec1n l\u00ean.<br><br><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">SecurityDefinitions<\/h3>\n\n\n\n<p>Authentication m\u00e0 APIs s\u1eed d\u1ee5ng \u0111\u1ec3 cung c\u1ea5p t\u00e0i nguy\u00ean.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"798\" height=\"241\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180809\/pasted-image-0-8-1.png\" alt=\"\" class=\"wp-image-532\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180809\/pasted-image-0-8-1.png 798w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180809\/pasted-image-0-8-1-300x91.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180809\/pasted-image-0-8-1-768x232.png 768w\" sizes=\"auto, (max-width: 798px) 100vw, 798px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><br \/><br \/>Definitions<\/h3>\n\n\n\n<p>\u0110\u1ecbnh ngh\u0129a c\u00e1c model s\u1eed d\u1ee5ng b\u1edfi APIs, bao g\u1ed3m:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Tham s\u1ed1 \u0111\u1ea7u ti\u00ean l\u00e0 t\u00ean c\u1ee7a Model (Order).<\/li><li>Ti\u1ebfp \u0111\u00f3 s\u1ebd l\u00e0 ph\u1ea7n ki\u1ec3u (type) \u0111\u1ecbnh d\u1ea1ng (object).<\/li><li>Sau \u0111\u00f3 l\u00e0 ph\u1ea7n thu\u1ed9c t\u00ednh (properties) c\u1ee7a Model n\u00e0y.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"799\" height=\"561\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180832\/pasted-image-0-9.png\" alt=\"\" class=\"wp-image-533\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180832\/pasted-image-0-9.png 799w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180832\/pasted-image-0-9-300x211.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180832\/pasted-image-0-9-768x539.png 768w\" sizes=\"auto, (max-width: 799px) 100vw, 799px\" \/>\r\n\r\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>UI Docs: c\u1ed9t b\u00ean ph\u1ea3i<\/strong><\/h3>\n\n\n\n<p>T\u1ea1i \u0111\u00e2y ta c\u00f3 th\u1ec3 bi\u1ebft r\u00f5 \u0111\u01b0\u1ee3c c\u00e1c th\u00f4ng tin chi ti\u1ebft v\u1ec1 API nh\u01b0: th\u00f4ng tin d\u1ef1 \u00e1n, c\u00e1c API \u0111\u01b0\u1ee3c cung c\u1ea5p, method v\u00e0 url t\u01b0\u01a1ng \u1ee9ng:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"504\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180851\/pasted-image-0-10-1024x504.png\" alt=\"\" class=\"wp-image-534\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180851\/pasted-image-0-10-1024x504.png 1024w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180851\/pasted-image-0-10-300x148.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180851\/pasted-image-0-10-768x378.png 768w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180851\/pasted-image-0-10-1536x756.png 1536w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180851\/pasted-image-0-10-1568x771.png 1568w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180851\/pasted-image-0-10.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><br><br>V\u1edbi m\u1ed7i API b\u1ea1n c\u00f3 th\u1ec3 bi\u1ebft \u0111\u01b0\u1ee3c chi ti\u1ebft input v\u00e0 output c\u0169ng nh\u01b0 tr\u01b0\u1eddng n\u00e0o b\u1eaft bu\u1ed9c g\u1eedi l\u00ean, k\u1ebft qu\u1ea3 tr\u1ea3 v\u1ec1 c\u00f3 th\u1ec3 nh\u1eadn nh\u1eefng status n\u00e0o. \u0110\u1eb7c bi\u1ec7t, ta c\u00f3 th\u1ec3 input data \u0111\u1ec3 th\u1eed ki\u1ec3m tra k\u1ebft qu\u1ea3.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"488\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180925\/pasted-image-0-11-1024x488.png\" alt=\"\" class=\"wp-image-535\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180925\/pasted-image-0-11-1024x488.png 1024w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180925\/pasted-image-0-11-300x143.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180925\/pasted-image-0-11-768x366.png 768w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15180925\/pasted-image-0-11.png 1431w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><br><br>Ho\u1eb7c c\u00f3 c\u00e1ch kh\u00e1c \u0111\u1ec3 xem Swagger UI, b\u1ea1n ch\u1ecdn Design View =&gt; Preview Docs.<\/p>\n\n\n\n<p>\u0110\u1ec3 Export ra code g\u1ecdi APIs, ch\u00fang ta ch\u1ecdn Export, ch\u1ecdn d\u1ea1ng m\u00e0 ch\u00fang ta mu\u1ed1n xu\u1ea5t ra.<\/p>\n\n\n\n<p>Ngo\u00e0i c\u00e1ch d\u00f9ng Swagger UI th\u00ec b\u1ea1n c\u00f3 th\u1ec3 d\u00f9ng \u1ee9ng d\u1ee5ng Postman \u0111\u1ec3 ki\u1ec3m tra v\u00e0 th\u1eed nghi\u1ec7m APIs.<br><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">S\u1eed d\u1ee5ng Postman \u0111\u1ec3 ki\u1ec3m tra Api?<\/h2>\n\n\n\n<p>\u0110\u1ec3 s\u1eed d\u1ee5ng Postman b\u1ea1n c\u00f3 th\u1ec3 d\u00f9ng \u0111\u01b0\u1eddng d\u1eabn public API m\u00e0 Swagger cung c\u1ea5p.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"512\" height=\"43\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15181038\/unnamed.png\" alt=\"\" class=\"wp-image-536\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15181038\/unnamed.png 512w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15181038\/unnamed-300x25.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/figure>\n\n\n\n<p><br>Khi d\u00f9ng \u0111\u01b0\u1eddng d\u1eabn, MEVN \u0111\u00e3 k\u1ebft n\u1ed1i th\u00e0nh c\u00f4ng \u0111\u1ebfn APIs v\u00e0 l\u1ea5y \u0111\u01b0\u1ee3c d\u1eef li\u1ec7u v\u1edbi petId. C\u00e1c b\u1ea1n s\u1ebd th\u1ea5y c\u00e1c d\u1eef li\u1ec7u nh\u01b0 id, category, name\u2026 \u0111\u01b0\u1ee3c tr\u1ea3 v\u1ec1.<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"977\" height=\"820\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15181127\/pasted-image-0-12.png\" alt=\"\" class=\"wp-image-537\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15181127\/pasted-image-0-12.png 977w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15181127\/pasted-image-0-12-300x252.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/15181127\/pasted-image-0-12-768x645.png 768w\" sizes=\"auto, (max-width: 977px) 100vw, 977px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><br \/>K\u1ebft lu\u1eadn<\/h2>\n\n\n\n<p>N\u00f3i chung Swagger s\u1ebd gi\u00fap b\u1ea1n t\u1ea1o m\u1ed9t file m\u00f4 t\u1ea3 chi ti\u1ebft v\u1ec1 Api v\u00e0 b\u1ea1n c\u00f3 th\u1ec3 th\u1eed nghi\u1ec7m Api ch\u1ea1y t\u1ed1t hay kh\u00f4ng. B\u1edfi v\u00ec document Api l\u00e0 y\u1ebfu t\u1ed1 quan tr\u1ecdng \u0111\u1ec3 c\u00f3 m\u1ed9t tr\u1ea3i nghi\u1ec7m t\u1ed1t khi s\u1eed d\u1ee5ng Api. N\u00f3 kh\u00f4ng ch\u1ec9 l\u00e0m h\u00e0i l\u00f2ng kh\u00e1ch h\u00e0ng m\u00e0 c\u00f2n gi\u00fap s\u1ed1 l\u01b0\u1ee3ng ng\u01b0\u1eddi s\u1eed d\u1ee5ng Api c\u1ee7a b\u1ea1n t\u0103ng l\u00ean.<br><br><\/p>\n\n\n\n<p>Ch\u1ec9 c\u1ea7n ch\u1eadm r\u00e3i, b\u1ea1n s\u1ebd nhanh ch\u00f3ng c\u1ea3m nh\u1eadn \u0111\u01b0\u1ee3c hi\u1ec7u qu\u1ea3 m\u00e0 Swagger mang \u0111\u1ebfn v\u1edbi b\u1ea3n th\u00e2n v\u00e0 c\u1ea3 \u0111\u1ed1i t\u00e1c c\u1ee7a b\u1ea1n.<br><br><\/p>\n\n\n\n<p>Khi \u0111\u00e3 hi\u1ec3u m\u1ecdi th\u1ee9 v\u00e0 \u00e1p d\u1ee5ng v\u00e0o d\u1ef1 \u00e1n, \u0111\u00f3 l\u00e0 c\u01a1 s\u1edf \u0111\u1ec3 b\u1ea1n c\u00f3 th\u1ec3 tin r\u1eb1ng, APIs c\u1ee7a b\u1ea1n \u0111ang ho\u1ea1t \u0111\u1ed9ng hi\u1ec7u qu\u1ea3.<\/p>\n\n\n\n<p>Tuy nhi\u00ean s\u1eed d\u1ee5ng Swagger Hub l\u1ea1i c\u00f3 1 nh\u01b0\u1ee3c \u0111i\u1ec3m l\u00e0 kh\u00f4ng t\u00e1ch th\u00e0nh c\u1ea5u tr\u00fac file &#8211; th\u01b0 m\u1ee5c, \u0111i\u1ec1u n\u00e0y g\u00e2y file config r\u1ea5t d\u00e0i v\u00e0 kh\u00f3 maintain. B\u1ea1n h\u00e3y th\u1eed t\u01b0\u1edfng t\u01b0\u1ee3ng c\u00f3 1 h\u1ec7 th\u1ed1ng 100 c\u00e1i APIs c\u1ea7n public, ki\u1ec3u d\u1eef li\u1ec7u to b\u1ef1 ch\u1ea3ng &#8230; v\u00e0 sau \u0111\u00f3 c\u1ea5u h\u00ecnh l\u1ed7i 1 APIs th\u00ec s\u1ebd s\u1eeda th\u1ebf n\u00e0o nh\u1ec9 \ud83d\ude1d.<br><br><\/p>\n\n\n\n<p>Tr\u00ean \u0111\u00e2y, ch\u00fang ta \u0111\u00e3 t\u00ecm hi\u1ec3u v\u1ec1 1 c\u00f4ng c\u1ee5 vi\u1ebft v\u00e0 qu\u1ea3n l\u00fd document APIs kh\u00e1 d\u1ec5 l\u00e0m quen v\u00e0 t\u1ef1 vi\u1ebft \u0111\u01b0\u1ee3c. Hy v\u1ecdng b\u00e0i vi\u1ebft n\u00e0y s\u1ebd gi\u00fap \u00edch cho d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n. C\u1ea3m \u01a1n v\u00ec \u0111\u00e3 \u0111\u1ecdc b\u00e0i vi\u1ebft c\u1ee7a MEVN!<\/p>\n\n\n\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ch\u00e0o c\u00e1c b\u1ea1n, \u1edf b\u00e0i vi\u1ebft n\u00e0y MarketEnterprise Vietnam (MEVN) s\u1ebd chia s\u1ebb m\u1ed9t c\u00f4ng c\u1ee5 c\u00f3 t\u00ean l\u00e0 Swagger. C\u00f4ng c\u1ee5 n\u00e0y s\u1ebd gi\u00fap \u00edch r\u1ea5t nhi\u1ec1u \u0111\u1ec3 \u0111\u01b0a d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n \u0111\u1ebfn v\u1edbi m\u1ecdi ng\u01b0\u1eddi.<\/p>\n","protected":false},"author":11,"featured_media":524,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[34,30,22],"class_list":["post-523","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology","tag-marketenterprise-vietnam","tag-swagger","tag-technical"],"_links":{"self":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts\/523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/comments?post=523"}],"version-history":[{"count":0,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts\/523\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/media\/524"}],"wp:attachment":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/media?parent=523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/categories?post=523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/tags?post=523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}