Định tuyến với MUX
Hãy tạo một CRUD api đơn giản cho một trang blog.
Chúng tôi sẽ cần 5 tuyến đường
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token comment"># All </span> <span class="token constant">GET</span> articles <span class="token operator">/</span> <span class="token comment"># Single article</span> <span class="token constant">GET</span> articles <span class="token operator">/</span> <span class="token symbol">:id</span> <span class="token comment"># Create new </span> <span class="token constant">POST</span> articles <span class="token operator">/</span> <span class="token comment"># Update an article</span> <span class="token constant">PUT</span> articles <span class="token operator">/</span> <span class="token symbol">:id</span> <span class="token comment"># Remove article</span> <span class="token constant">DELETE</span> articles <span class="token operator">/</span> <span class="token symbol">:id</span> |
Đầu tiên, chúng tôi tạo một tệp main.go
trong thư mục dự án của chúng tôi
1 2 | <span class="token function">touch</span> main.go |
Điền mã khung bên trong
1 2 3 4 5 6 7 | <span class="token keyword">package</span> main <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> |
Để định tuyến, chúng tôi sẽ sử dụng một gói có tên là mux
Chúng tôi có thể tải xuống bằng cách chạy
1 2 | <span class="token keyword">go</span> get <span class="token operator">-</span> u github <span class="token punctuation">.</span> com <span class="token operator">/</span> gorilla <span class="token operator">/</span> mux |
Nếu bạn kiểm tra thư mục $GOPATH/pkg
, bạn sẽ tìm thấy gói mux
mới được tải xuống bên trong.
Bây giờ, chúng tôi đã tải xuống mux
, hãy khởi tạo nó trong tệp main.go
của chúng tôi. Đối với điều đó, chúng tôi cần nhập nó trước.
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"github.com/gorilla/mux"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> router <span class="token operator">:=</span> mux <span class="token punctuation">.</span> <span class="token function">NewRouter</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Thêm các tuyến đường vào mux là rất dễ dàng. Bạn chỉ cần viết tuyến đường, chức năng nó sẽ chạy và phương thức HTTP mà nó phản hồi
1 2 | router <span class="token punctuation">.</span> <span class="token function">HandleFunc</span> <span class="token punctuation">(</span> <span class="token string">"/api/articles"</span> <span class="token punctuation">,</span> getArticles <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Methods</span> <span class="token punctuation">(</span> <span class="token string">"GET"</span> <span class="token punctuation">)</span> |
Điều này có nghĩa là, bất cứ khi nào ứng dụng của chúng tôi nhận được yêu cầu GET
trong đường dẫn "/api/articles"
getArticles
"/api/articles"
, chúng tôi sẽ chạy hàm getArticles
. Chúng tôi chưa xác định hàm, bây giờ chúng tôi chỉ muốn dữ liệu hạt giống được trả về. Loại
1 2 3 4 | <span class="token keyword">func</span> <span class="token function">getArticles</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> listOfArticles <span class="token punctuation">}</span> |
Vì vậy, chúng ta nên tạo dữ liệu hạt giống trước, trước khi chuyển sang viết phương thức getArticles
.
Đối với đối tượng bài viết và đối tượng người dùng, chúng ta cần tạo một cấu trúc như
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token punctuation">{</span> ID <span class="token builtin">string</span> Username <span class="token builtin">string</span> Email <span class="token builtin">string</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Article <span class="token keyword">struct</span> <span class="token punctuation">{</span> ID <span class="token builtin">string</span> Title <span class="token builtin">string</span> Description <span class="token builtin">string</span> Content <span class="token builtin">string</span> Author <span class="token operator">*</span> User <span class="token punctuation">}</span> |
Lưu ý rằng, mỗi bài viết sẽ có một Author
, một đối tượng của User
cấu trúc. Đối với listOfArticles, chúng tôi sẽ sử dụng một lát
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token punctuation">[</span> <span class="token punctuation">]</span> Article <span class="token punctuation">{</span> Article <span class="token punctuation">{</span> ID <span class="token punctuation">:</span> <span class="token string">"1"</span> <span class="token punctuation">,</span> Title <span class="token punctuation">:</span> <span class="token string">"Learning golang"</span> <span class="token punctuation">,</span> Description <span class="token punctuation">:</span> <span class="token string">"an introduction to the go ecosystem"</span> <span class="token punctuation">,</span> Content <span class="token punctuation">:</span> <span class="token string">"..."</span> <span class="token punctuation">,</span> Author <span class="token punctuation">:</span> <span class="token operator">&</span> User <span class="token punctuation">{</span> ID <span class="token punctuation">:</span> <span class="token string">"1"</span> <span class="token punctuation">,</span> Username <span class="token punctuation">:</span> <span class="token string">"salekin"</span> <span class="token punctuation">,</span> Email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> Article <span class="token punctuation">{</span> ID <span class="token punctuation">:</span> <span class="token string">"2"</span> <span class="token punctuation">,</span> Title <span class="token punctuation">:</span> <span class="token string">"Learning GIN"</span> <span class="token punctuation">,</span> Description <span class="token punctuation">:</span> <span class="token string">"intro to GIN framework"</span> <span class="token punctuation">,</span> Content <span class="token punctuation">:</span> <span class="token string">"..."</span> <span class="token punctuation">,</span> Author <span class="token punctuation">:</span> <span class="token operator">&</span> User <span class="token punctuation">{</span> ID <span class="token punctuation">:</span> <span class="token string">"1"</span> <span class="token punctuation">,</span> Username <span class="token punctuation">:</span> <span class="token string">"salekin"</span> <span class="token punctuation">,</span> Email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> |
Ngoài ra, nếu chúng ta muốn trả lại các tên đã nộp khác trong json từ struct, chúng ta có thể sửa đổi cấu trúc như
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token punctuation">{</span> ID <span class="token builtin">string</span> <span class="token string">`json:"id"`</span> Username <span class="token builtin">string</span> <span class="token string">`json:"user"`</span> Email <span class="token builtin">string</span> <span class="token string">`json:"email"`</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Article <span class="token keyword">struct</span> <span class="token punctuation">{</span> ID <span class="token builtin">string</span> <span class="token string">`json:"id"`</span> Title <span class="token builtin">string</span> <span class="token string">`json:"title"`</span> Description <span class="token builtin">string</span> <span class="token string">`json:"description"`</span> Content <span class="token builtin">string</span> <span class="token string">`json:"content"`</span> Author <span class="token operator">*</span> User <span class="token string">`json:"author"`</span> <span class="token punctuation">}</span> |
Tại thời điểm này, main.go
của chúng ta sẽ giống như
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"github.com/gorilla/mux"</span> <span class="token punctuation">)</span> <span class="token keyword">var</span> articles <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> Article <span class="token punctuation">{</span> Article <span class="token punctuation">{</span> ID <span class="token punctuation">:</span> <span class="token string">"1"</span> <span class="token punctuation">,</span> Title <span class="token punctuation">:</span> <span class="token string">"Learning golang"</span> <span class="token punctuation">,</span> Description <span class="token punctuation">:</span> <span class="token string">"an introduction to the go ecosystem"</span> <span class="token punctuation">,</span> Content <span class="token punctuation">:</span> <span class="token string">"..."</span> <span class="token punctuation">,</span> Author <span class="token punctuation">:</span> <span class="token operator">&</span> User <span class="token punctuation">{</span> ID <span class="token punctuation">:</span> <span class="token string">"1"</span> <span class="token punctuation">,</span> Username <span class="token punctuation">:</span> <span class="token string">"salekin"</span> <span class="token punctuation">,</span> Email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> Article <span class="token punctuation">{</span> ID <span class="token punctuation">:</span> <span class="token string">"2"</span> <span class="token punctuation">,</span> Title <span class="token punctuation">:</span> <span class="token string">"Learning GIN"</span> <span class="token punctuation">,</span> Description <span class="token punctuation">:</span> <span class="token string">"intro to GIN framework"</span> <span class="token punctuation">,</span> Content <span class="token punctuation">:</span> <span class="token string">"..."</span> <span class="token punctuation">,</span> Author <span class="token punctuation">:</span> <span class="token operator">&</span> User <span class="token punctuation">{</span> ID <span class="token punctuation">:</span> <span class="token string">"1"</span> <span class="token punctuation">,</span> Username <span class="token punctuation">:</span> <span class="token string">"salekin"</span> <span class="token punctuation">,</span> Email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> m"</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token punctuation">{</span> ID <span class="token builtin">string</span> <span class="token string">`json:"id"`</span> Username <span class="token builtin">string</span> <span class="token string">`json:"user"`</span> Email <span class="token builtin">string</span> <span class="token string">`json:"email"`</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Article <span class="token keyword">struct</span> <span class="token punctuation">{</span> ID <span class="token builtin">string</span> <span class="token string">`json:"id"`</span> Title <span class="token builtin">string</span> <span class="token string">`json:"title"`</span> Description <span class="token builtin">string</span> <span class="token string">`json:"description"`</span> Content <span class="token builtin">string</span> <span class="token string">`json:"content"`</span> Author <span class="token operator">*</span> User <span class="token string">`json:"author"`</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> router <span class="token operator">:=</span> mux <span class="token punctuation">.</span> <span class="token function">NewRouter</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> router <span class="token punctuation">.</span> <span class="token function">HandleFunc</span> <span class="token punctuation">(</span> <span class="token string">"/api/articles"</span> <span class="token punctuation">,</span> getArticles <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Methods</span> <span class="token punctuation">(</span> <span class="token string">"GET"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Cuối cùng, chúng ta có thời gian để tạo hàm getArticles
.
1 2 3 4 | <span class="token keyword">func</span> <span class="token function">getArticles</span> <span class="token punctuation">(</span> w http <span class="token punctuation">.</span> ResponseWriter <span class="token punctuation">,</span> r <span class="token operator">*</span> http <span class="token punctuation">.</span> Request <span class="token punctuation">)</span> <span class="token punctuation">{</span> json <span class="token punctuation">.</span> <span class="token function">NewEncoder</span> <span class="token punctuation">(</span> w <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Encode</span> <span class="token punctuation">(</span> articles <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Dễ dàng như vậy. Bây giờ chúng tôi điền vào phần còn lại của các tuyến đường.
Nhận bài báo
Chúng tôi sẽ lặp lại danh sách các bài viết và trả về một bài phù hợp với id chúng tôi đã gửi trong url
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> router <span class="token punctuation">.</span> <span class="token function">HandleFunc</span> <span class="token punctuation">(</span> <span class="token string">"/api/articles/{id}"</span> <span class="token punctuation">,</span> getArticle <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Methods</span> <span class="token punctuation">(</span> <span class="token string">"GET"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">getArticle</span> <span class="token punctuation">(</span> w http <span class="token punctuation">.</span> ResponseWriter <span class="token punctuation">,</span> r <span class="token operator">*</span> http <span class="token punctuation">.</span> Request <span class="token punctuation">)</span> <span class="token punctuation">{</span> params <span class="token operator">:=</span> mux <span class="token punctuation">.</span> <span class="token function">Vars</span> <span class="token punctuation">(</span> r <span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token boolean">_</span> <span class="token punctuation">,</span> article <span class="token operator">:=</span> <span class="token keyword">range</span> articles <span class="token punctuation">{</span> <span class="token keyword">if</span> article <span class="token punctuation">.</span> ID <span class="token operator">==</span> params <span class="token punctuation">[</span> <span class="token string">"id"</span> <span class="token punctuation">]</span> <span class="token punctuation">{</span> json <span class="token punctuation">.</span> <span class="token function">NewEncoder</span> <span class="token punctuation">(</span> w <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Encode</span> <span class="token punctuation">(</span> article <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Tạo bài viết mới
Chúng tôi sẽ tạo một đối tượng bài viết mới của struct Article
và thêm nó vào lát articles
.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> router <span class="token punctuation">.</span> <span class="token function">HandleFunc</span> <span class="token punctuation">(</span> <span class="token string">"/api/articles/"</span> <span class="token punctuation">,</span> create <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Methods</span> <span class="token punctuation">(</span> <span class="token string">"POST"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">create</span> <span class="token punctuation">(</span> w http <span class="token punctuation">.</span> ResponseWriter <span class="token punctuation">,</span> r <span class="token operator">*</span> http <span class="token punctuation">.</span> Request <span class="token punctuation">)</span> <span class="token punctuation">{</span> article <span class="token operator">:=</span> Article <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token boolean">_</span> <span class="token operator">=</span> json <span class="token punctuation">.</span> <span class="token function">NewDecoder</span> <span class="token punctuation">(</span> r <span class="token punctuation">.</span> Body <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Decode</span> <span class="token punctuation">(</span> <span class="token operator">&</span> article <span class="token punctuation">)</span> article <span class="token punctuation">.</span> ID <span class="token operator">=</span> strconv <span class="token punctuation">.</span> <span class="token function">Itoa</span> <span class="token punctuation">(</span> <span class="token function">len</span> <span class="token punctuation">(</span> articles <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">)</span> articles <span class="token operator">=</span> <span class="token function">append</span> <span class="token punctuation">(</span> articles <span class="token punctuation">,</span> article <span class="token punctuation">)</span> json <span class="token punctuation">.</span> <span class="token function">NewEncoder</span> <span class="token punctuation">(</span> w <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Encode</span> <span class="token punctuation">(</span> article <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Cập nhật một bài báo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> router <span class="token punctuation">.</span> <span class="token function">HandleFunc</span> <span class="token punctuation">(</span> <span class="token string">"/api/articles/{id}"</span> <span class="token punctuation">,</span> update <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Methods</span> <span class="token punctuation">(</span> <span class="token string">"PUT"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">update</span> <span class="token punctuation">(</span> w http <span class="token punctuation">.</span> ResponseWriter <span class="token punctuation">,</span> r <span class="token operator">*</span> http <span class="token punctuation">.</span> Request <span class="token punctuation">)</span> <span class="token punctuation">{</span> params <span class="token operator">:=</span> mux <span class="token punctuation">.</span> <span class="token function">Vars</span> <span class="token punctuation">(</span> r <span class="token punctuation">)</span> article <span class="token operator">:=</span> Article <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token boolean">_</span> <span class="token operator">=</span> json <span class="token punctuation">.</span> <span class="token function">NewDecoder</span> <span class="token punctuation">(</span> r <span class="token punctuation">.</span> Body <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Decode</span> <span class="token punctuation">(</span> <span class="token operator">&</span> article <span class="token punctuation">)</span> article <span class="token punctuation">.</span> ID <span class="token operator">=</span> params <span class="token punctuation">[</span> <span class="token string">"id"</span> <span class="token punctuation">]</span> <span class="token keyword">for</span> i <span class="token punctuation">,</span> article <span class="token operator">:=</span> <span class="token keyword">range</span> articles <span class="token punctuation">{</span> <span class="token keyword">if</span> article <span class="token punctuation">.</span> ID <span class="token operator">==</span> params <span class="token punctuation">[</span> <span class="token string">"id"</span> <span class="token punctuation">]</span> <span class="token punctuation">{</span> articles <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token operator">=</span> article <span class="token keyword">break</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> json <span class="token punctuation">.</span> <span class="token function">NewEncoder</span> <span class="token punctuation">(</span> w <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Encode</span> <span class="token punctuation">(</span> article <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Xóa một bài báo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> router <span class="token punctuation">.</span> <span class="token function">HandleFunc</span> <span class="token punctuation">(</span> <span class="token string">"/api/articles/{id}"</span> <span class="token punctuation">,</span> <span class="token builtin">delete</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Methods</span> <span class="token punctuation">(</span> <span class="token string">"DELETE"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">delete</span> <span class="token punctuation">(</span> w http <span class="token punctuation">.</span> ResponseWriter <span class="token punctuation">,</span> r <span class="token operator">*</span> http <span class="token punctuation">.</span> Request <span class="token punctuation">)</span> <span class="token punctuation">{</span> params <span class="token operator">:=</span> mux <span class="token punctuation">.</span> <span class="token function">Vars</span> <span class="token punctuation">(</span> r <span class="token punctuation">)</span> <span class="token keyword">for</span> i <span class="token punctuation">,</span> article <span class="token operator">:=</span> <span class="token keyword">range</span> articles <span class="token punctuation">{</span> <span class="token keyword">if</span> article <span class="token punctuation">.</span> ID <span class="token operator">==</span> params <span class="token punctuation">[</span> <span class="token string">"id"</span> <span class="token punctuation">]</span> <span class="token punctuation">{</span> articles <span class="token operator">=</span> <span class="token function">append</span> <span class="token punctuation">(</span> articles <span class="token punctuation">[</span> <span class="token punctuation">:</span> i <span class="token punctuation">]</span> <span class="token punctuation">,</span> articles <span class="token punctuation">[</span> <span class="token punctuation">:</span> i <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token operator">...</span> <span class="token punctuation">)</span> <span class="token keyword">break</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> json <span class="token punctuation">.</span> <span class="token function">NewEncoder</span> <span class="token punctuation">(</span> w <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">Encode</span> <span class="token punctuation">(</span> articles <span class="token punctuation">)</span> <span class="token punctuation">}</span> |