<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Динь Чыонг Лам</title>
    <description>The latest articles on DEV Community by Динь Чыонг Лам (@kaitokid2302).</description>
    <link>https://dev.to/kaitokid2302</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2206060%2Fcfc4292c-ed06-4ada-bdd1-8820c6d95aec.jpeg</url>
      <title>DEV Community: Динь Чыонг Лам</title>
      <link>https://dev.to/kaitokid2302</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kaitokid2302"/>
    <language>en</language>
    <item>
      <title>Implement swaggo</title>
      <dc:creator>Динь Чыонг Лам</dc:creator>
      <pubDate>Fri, 22 Nov 2024 10:50:20 +0000</pubDate>
      <link>https://dev.to/kaitokid2302/implement-swaggo-4i9c</link>
      <guid>https://dev.to/kaitokid2302/implement-swaggo-4i9c</guid>
      <description>&lt;p&gt;Hãy hình dung tình huống sau: bạn đã hoàn thành việc phát triển một API hoàn toàn mới, và giờ cần viết tài liệu để hướng dẫn khi xây dựng các ứng dụng client-side sử dụng API đó. Bạn bắt đầu nghĩ về các cách khác nhau để thực hiện điều này và liệt kê ra nhiều lựa chọn như Swagger, Docusaurus, Postman và nhiều hơn nữa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3crc9kpbkdlfviwfm8u0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3crc9kpbkdlfviwfm8u0.jpg" width="730" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bạn nhớ lại áp lực liên quan đến giai đoạn viết tài liệu API và tự hỏi liệu có cách tắt nào để tăng tốc hay không – bạn không thể bỏ qua giai đoạn này, bởi phần mềm có ích gì nếu không ai có thể sử dụng nó?&lt;/p&gt;

&lt;p&gt;Tool yêu thích của tôi để tạo tài liệu API là &lt;a href="https://swagger.io/" rel="noopener noreferrer"&gt;Swagger&lt;/a&gt; bởi sự dễ dàng trong việc tạo, duy trì và xuất bản tài liệu API. Swagger là một bộ công cụ mã nguồn mở chuyên nghiệp giúp người dùng, nhóm và doanh nghiệp dễ dàng tạo và tài liệu hóa APIs ở quy mô lớn. Đây là một &lt;a href="https://petstore.swagger.io/" rel="noopener noreferrer"&gt;demo&lt;/a&gt; để bạn cảm nhận cách Swagger hoạt động.&lt;/p&gt;

&lt;p&gt;Lợi ích của việc sử dụng Swagger trong dự án tiếp theo của bạn bao gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cho phép bạn tạo, duy trì và xuất bản tài liệu API một cách nhanh chóng và dễ dàng&lt;/li&gt;
&lt;li&gt;Tạo ra tài liệu tương tác đẹp mắt cho phép bạn xác thực và kiểm thử các endpoint API từ trình duyệt mà không cần phần mềm bên thứ ba&lt;/li&gt;
&lt;li&gt;Dễ dàng hiểu được bởi cả nhà phát triển và người không chuyên&lt;/li&gt;
&lt;li&gt;Chức năng để &lt;a href="https://github.com/swagger-api/swagger-codegen" rel="noopener noreferrer"&gt;generate API client libraries&lt;/a&gt; (SDKs) cho nhiều ngôn ngữ và frameworks khác nhau trực tiếp từ một OpenAPI specification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hướng dẫn này sẽ chỉ cho bạn cách tạo tài liệu Swagger cho Go web APIs trực tiếp từ source code bằng cách sử dụng annotations và &lt;a href="https://github.com/swaggo/swag" rel="noopener noreferrer"&gt;Swag&lt;/a&gt;. Trong bài viết này, chúng ta sẽ xây dựng một web API demo với &lt;a href="https://blog.logrocket.com/how-to-build-a-rest-api-with-golang-using-gin-and-gorm/" rel="noopener noreferrer"&gt;Go và Gin&lt;/a&gt;, sau đó tạo tài liệu cho nó bằng Swag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Yêu cầu trước khi bắt đầu
&lt;/h2&gt;

&lt;p&gt;Để theo dõi và hiểu hướng dẫn này, bạn sẽ cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kiến thức cơ bản về cách APIs hoạt động&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.logrocket.com/getting-started-with-go-for-frontend-developers/" rel="noopener noreferrer"&gt;Kiến thức cơ bản về Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Đã cài đặt &lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; trên máy của bạn&lt;/li&gt;
&lt;li&gt;Đã cài đặt Go 1.x trên máy của bạn&lt;/li&gt;
&lt;li&gt;Môi trường phát triển Go&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build a demo Go web API
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Xây dựng một Go web API demo
&lt;/h2&gt;

&lt;p&gt;Gin là web framework đầy đủ tính năng nhanh nhất cho Go, với API giống như &lt;a href="https://github.com/go-martini/martini" rel="noopener noreferrer"&gt;Martini&lt;/a&gt; nhấn mạnh vào hiệu suất và năng suất. Gin nhanh, không gặp crash, có thể mở rộng với built-in rendering, và có các tính năng hỗ trợ middleware, grouping routes và quản lý lỗi tiện lợi.&lt;/p&gt;

&lt;p&gt;Bây giờ hãy xây dựng web API cho một ứng dụng "to do" cơ bản.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Set up your development environment
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 1: Thiết lập môi trường phát triển
&lt;/h3&gt;

&lt;p&gt;Tạo một dự án Go mới trong trình soạn thảo văn bản hoặc IDE của bạn và khởi tạo file &lt;code&gt;go.mod&lt;/code&gt;. Bạn có thể sử dụng bất kỳ tên nào cho package của mình:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;swag&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;demo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install Gin
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 2: Cài đặt Gin
&lt;/h3&gt;

&lt;p&gt;Cài đặt Gin web framework trong dự án của bạn. Trong terminal, nhập:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gonic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Set up a Gin server
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 3: Thiết lập Gin server
&lt;/h3&gt;

&lt;p&gt;Tạo một file tên &lt;code&gt;main.go&lt;/code&gt; và lưu đoạn code sau vào:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"github.com/gin-gonic/gin"&lt;/span&gt;
        &lt;span class="s"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// configure the Gin server&lt;/span&gt;
        &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c"&gt;// run the Gin server&lt;/span&gt;
        &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hãy tạo một kiểu &lt;code&gt;todo&lt;/code&gt; và khởi tạo danh sách với một số dữ liệu. Thêm đoạn code sau vào file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// todo represents data about a task in the todo list&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ID&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"id"`&lt;/span&gt;
        &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"task"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// message represents request response with a message&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"message"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// todo slice to seed todo list data&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;todoList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Learn Go"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Build an API with Go"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Document the API with swag"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thêm đoạn code sau vào file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;getAllTodos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;todoList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// configure the Gin server&lt;/span&gt;
        &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/todo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getAllTodos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;// run the Gin server&lt;/span&gt;
        &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chạy ứng dụng:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Create the &lt;code&gt;getTodoByID&lt;/code&gt; route
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 5: Tạo route &lt;code&gt;getTodoByID&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Tạo một route handler sẽ nhận một request &lt;code&gt;GET&lt;/code&gt; từ client và một &lt;code&gt;todo ID&lt;/code&gt;, sau đó trả về chi tiết của mục tương ứng từ danh sách todo.&lt;/p&gt;

&lt;p&gt;Thêm đoạn code sau vào file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;getTodoByID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;// loop through todoList and return item with matching ID&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;todoList&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="k"&gt;return&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;// return error message if todo is not found&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"todo not found"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusNotFound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thêm route vào router:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/todo/:id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getTodoByID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kiểm thử route bằng Postman:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w4qgv2pfjc3gn7nj4he.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w4qgv2pfjc3gn7nj4he.png" alt="Phản hồi Postman cho route getTodoByID" width="730" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Create the &lt;code&gt;createTodo&lt;/code&gt; route
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 6: Tạo route &lt;code&gt;createTodo&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Tạo một route handler sẽ nhận một request &lt;code&gt;POST&lt;/code&gt; từ client với một &lt;code&gt;todo ID&lt;/code&gt; và &lt;code&gt;task&lt;/code&gt;, sau đó thêm một mục mới vào danh sách todo.&lt;/p&gt;

&lt;p&gt;Thêm đoạn code sau vào file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;createTodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;newTodo&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt;

        &lt;span class="c"&gt;// bind the received JSON data to newTodo&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BindJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"an error occurred while creating todo"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusBadRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;// add the new todo item to todoList&lt;/span&gt;
        &lt;span class="n"&gt;todoList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todoList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thêm route vào router:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/todo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;createTodo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kiểm thử route bằng Postman:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkitqgdv0oq31zk2ju5xq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkitqgdv0oq31zk2ju5xq.png" alt="Phản hồi Postman cho route createTodo" width="730" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Create the &lt;code&gt;deleteTodo&lt;/code&gt; route
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 7: Tạo route &lt;code&gt;deleteTodo&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Tạo một route handler sẽ nhận một request &lt;code&gt;DELETE&lt;/code&gt; từ client cùng với một &lt;code&gt;todo ID&lt;/code&gt;, sau đó xóa mục tương ứng khỏi danh sách todo. Thêm đoạn code sau vào file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;deleteTodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;// loop through todoList and delete item with matching ID&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;todoList&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;todoList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todoList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;todoList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"successfully deleted todo"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="k"&gt;return&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;// return error message if todo is not found&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"todo not found"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusNotFound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thêm route vào router:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/todo/:id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deleteTodo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kiểm thử route bằng Postman:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjcayl5x4eexv3bxm12f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjcayl5x4eexv3bxm12f.png" alt="Phản hồi Postman cho route deleteTodo" width="730" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Document the web API with Swag
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Tài liệu hóa web API với Swag
&lt;/h2&gt;

&lt;p&gt;Swag là middleware giúp tự động tạo tài liệu RESTful API với Swagger 2.0 cho Go trực tiếp từ source code bằng cách sử dụng annotations. Nó yêu cầu bạn chỉ định cách các route hoạt động và tự động hóa toàn bộ quá trình tạo tài liệu Swagger.&lt;/p&gt;

&lt;p&gt;Swag tương thích với nhiều &lt;a href="https://github.com/swaggo/swag#supported-web-frameworks" rel="noopener noreferrer"&gt;Go web frameworks&lt;/a&gt; và có nhiều tích hợp cho chúng. Hướng dẫn này sẽ sử dụng tích hợp với Gin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Swag
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 1: Cài đặt Swag
&lt;/h3&gt;

&lt;p&gt;Cài đặt package Swag trong dự án của bạn. Trong terminal, nhập:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;swaggo&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;swag&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;swag&lt;/span&gt;
&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;swaggo&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;swagger&lt;/span&gt;
&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;swaggo&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Khởi tạo Swag trong dự án của bạn. Trong terminal, nhập:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;swag&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu terminal của bạn không nhận ra lệnh &lt;code&gt;swag init&lt;/code&gt;, bạn cần thêm thư mục &lt;code&gt;Go bin&lt;/code&gt; vào PATH.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlrizz60m6vtk34fz6do.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlrizz60m6vtk34fz6do.png" alt="Cấu trúc thư mục sau khi chạy swag init" width="600" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Import the Swag package into your project
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 3: Import package Swag vào dự án của bạn
&lt;/h3&gt;

&lt;p&gt;Cập nhật phần import trong file &lt;code&gt;main.go&lt;/code&gt; với đoạn code dưới đây:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"github.com/gin-gonic/gin"&lt;/span&gt;
        &lt;span class="n"&gt;swaggerFiles&lt;/span&gt; &lt;span class="s"&gt;"github.com/swaggo/files"&lt;/span&gt;
        &lt;span class="n"&gt;ginSwagger&lt;/span&gt; &lt;span class="s"&gt;"github.com/swaggo/gin-swagger"&lt;/span&gt;
        &lt;span class="s"&gt;"net/http"&lt;/span&gt;
        &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="s"&gt;"swag-gin-demo/docs"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Add general API annotations to the code
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 4: Thêm các annotation API chung vào code
&lt;/h3&gt;

&lt;p&gt;Các &lt;a href="https://github.com/swaggo/swag#general-api-info" rel="noopener noreferrer"&gt;annotation API chung&lt;/a&gt; chứa thông tin cơ bản về tài liệu API (tiêu đề, mô tả, phiên bản, thông tin liên hệ, host và giấy phép).&lt;/p&gt;

&lt;p&gt;Thêm bộ annotation sau vào file &lt;code&gt;main.go&lt;/code&gt; (tốt nhất là trước hàm &lt;code&gt;main&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @title Go + Gin Todo API&lt;/span&gt;
&lt;span class="c"&gt;// @version 1.0&lt;/span&gt;
&lt;span class="c"&gt;// @description This is a sample server todo server. You can visit the GitHub repository at https://github.com/LordGhostX/swag-gin-demo&lt;/span&gt;

&lt;span class="c"&gt;// @contact.name API Support&lt;/span&gt;
&lt;span class="c"&gt;// @contact.url http://www.swagger.io/support&lt;/span&gt;
&lt;span class="c"&gt;// @contact.email support@swagger.io&lt;/span&gt;

&lt;span class="c"&gt;// @license.name MIT&lt;/span&gt;
&lt;span class="c"&gt;// @license.url https://opensource.org/licenses/MIT&lt;/span&gt;

&lt;span class="c"&gt;// @host localhost:8080&lt;/span&gt;
&lt;span class="c"&gt;// @BasePath /&lt;/span&gt;
&lt;span class="c"&gt;// @query.collection.format multi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Add API operation annotations to &lt;code&gt;controller&lt;/code&gt; code
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Bước 5: Thêm các annotation hoạt động API vào code &lt;code&gt;controller&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Các annotation hoạt động API chứa cách &lt;code&gt;controller&lt;/code&gt; hoạt động (mô tả, route, loại request, tham số và mã phản hồi). Hãy xem cách thêm annotation cho route &lt;code&gt;getAllTodos&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Thêm các annotation sau ngay trước hàm &lt;code&gt;getAllTodos&lt;/code&gt; trong file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @Summary get all items in the todo list&lt;/span&gt;
&lt;span class="c"&gt;// @ID get-all-todos&lt;/span&gt;
&lt;span class="c"&gt;// @Produce json&lt;/span&gt;
&lt;span class="c"&gt;// @Success 200 {object} todo&lt;/span&gt;
&lt;span class="c"&gt;// @Router /todo [get]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trong đoạn code trên, chúng ta đã định nghĩa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@Summary&lt;/code&gt;, tóm tắt về chức năng của route&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@ID&lt;/code&gt;, một định danh duy nhất cho route (bắt buộc cho mỗi route)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Produce&lt;/code&gt;, kiểu dữ liệu phản hồi của route&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Success 200&lt;/code&gt;, mô hình phản hồi cho mã trạng thái mong đợi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Router /todo [get]&lt;/code&gt;, URI của route và phương thức request được chấp nhận&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tiếp theo, chúng ta sẽ thêm annotation cho route &lt;code&gt;getTodoByID&lt;/code&gt;. Thêm đoạn code sau ngay trước hàm &lt;code&gt;getTodoByID&lt;/code&gt; trong file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @Summary get a todo item by ID&lt;/span&gt;
&lt;span class="c"&gt;// @ID get-todo-by-id&lt;/span&gt;
&lt;span class="c"&gt;// @Produce json&lt;/span&gt;
&lt;span class="c"&gt;// @Param id path string true "todo ID"&lt;/span&gt;
&lt;span class="c"&gt;// @Success 200 {object} todo&lt;/span&gt;
&lt;span class="c"&gt;// @Failure 404 {object} message&lt;/span&gt;
&lt;span class="c"&gt;// @Router /todo/{id} [get]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ở đây, chúng ta chỉ định cho Swag rằng route chấp nhận một tham số bắt buộc kiểu &lt;code&gt;string&lt;/code&gt; tên &lt;code&gt;id&lt;/code&gt; được đính kèm vào &lt;code&gt;path&lt;/code&gt; của request. Nó có tên là &lt;code&gt;todo ID&lt;/code&gt; với &lt;code&gt;@Param id path string true "todo ID"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tiếp theo, chúng ta sẽ thêm annotation cho route &lt;code&gt;createTodo&lt;/code&gt;. Thêm đoạn code sau ngay trước hàm &lt;code&gt;createTodo&lt;/code&gt; trong file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @Summary add a new item to the todo list&lt;/span&gt;
&lt;span class="c"&gt;// @ID create-todo&lt;/span&gt;
&lt;span class="c"&gt;// @Produce json&lt;/span&gt;
&lt;span class="c"&gt;// @Param data body todo true "todo data"&lt;/span&gt;
&lt;span class="c"&gt;// @Success 200 {object} todo&lt;/span&gt;
&lt;span class="c"&gt;// @Failure 400 {object} message&lt;/span&gt;
&lt;span class="c"&gt;// @Router /todo [post]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ở đây, chúng ta chỉ định cho Swag rằng route chấp nhận một tham số bắt buộc kiểu &lt;code&gt;todo&lt;/code&gt; tên &lt;code&gt;data&lt;/code&gt; được đính kèm vào &lt;code&gt;body&lt;/code&gt; của request. Nó có tên là &lt;code&gt;todo data&lt;/code&gt; với &lt;code&gt;@Param data body todo true "todo data"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Chúng ta sẽ thêm annotation cho route &lt;code&gt;deleteTodo&lt;/code&gt;. Thêm đoạn code sau ngay trước hàm &lt;code&gt;deleteTodo&lt;/code&gt; trong file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @Summary delete a todo item by ID&lt;/span&gt;
&lt;span class="c"&gt;// @ID delete-todo-by-id&lt;/span&gt;
&lt;span class="c"&gt;// @Produce json&lt;/span&gt;
&lt;span class="c"&gt;// @Param id path string true "todo ID"&lt;/span&gt;
&lt;span class="c"&gt;// @Success 200 {object} todo&lt;/span&gt;
&lt;span class="c"&gt;// @Failure 404 {object} message&lt;/span&gt;
&lt;span class="c"&gt;// @Router /todo/{id} [delete]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  View and test the documentation
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Xem và kiểm thử tài liệu
&lt;/h2&gt;

&lt;p&gt;Bây giờ bạn đã định nghĩa tất cả các annotation cho server và các route, hãy xem và kiểm thử tài liệu.&lt;/p&gt;

&lt;p&gt;Để tạo tài liệu từ code của bạn, chạy lại lệnh &lt;code&gt;swag init&lt;/code&gt; trong terminal như sau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;swag init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chúng ta cũng cần đăng ký một route handler vào router của Gin chịu trách nhiệm render tài liệu Swagger được tạo bởi Swag. Thêm đoạn code sau vào cấu hình router trong &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// docs route&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/docs/*any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ginSwagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WrapHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swaggerFiles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Khởi chạy ứng dụng:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Truy cập &lt;code&gt;http://localhost:8080/docs/index.html&lt;/code&gt; trong trình duyệt của bạn để xem tài liệu Swagger:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5gpj6e4bwew0jrr7uy6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5gpj6e4bwew0jrr7uy6.png" alt="Tài liệu cho route getAllTodos" width="730" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2befq9oz1y0y94pumrx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2befq9oz1y0y94pumrx4.png" alt="Các mô hình dữ liệu Swagger được Swag tài liệu hóa" width="730" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Kết luận
&lt;/h2&gt;

&lt;p&gt;Bài viết này đã chỉ cho bạn cách tạo tài liệu Swagger cho web APIs được xây dựng bằng Go một cách liền mạch bằng cách sử dụng Swag. Bạn có thể tìm hiểu thêm về Swag từ &lt;a href="https://github.com/swaggo/swag" rel="noopener noreferrer"&gt;tài liệu chính thức&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Chúng tôi đã chọn sử dụng Swagger vì nhiều tính năng và chức năng giúp việc tạo và duy trì tài liệu cho web APIs trở nên dễ dàng.&lt;/p&gt;

&lt;p&gt;Source code của web API được xây dựng và tài liệu hóa trong hướng dẫn này có sẵn trên &lt;a href="https://github.com/LordGhostX/swag-gin-demo" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; để bạn khám phá.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
