Bắt đầu với Framework Web Go Iris

Cài đặt

Ghi chú: Yêu cầu phiên bản Go từ 1.20 trở lên.

$ mkdir myapp
$ cd myapp
$ go mod init myapp
$ go get github.com/kataras/iris/v12@latest

Nhúng nó vào mã của bạn:

import "github.com/kataras/iris/v12"

Sửa lỗi cài đặt

Nếu bạn gặp lỗi mạng trong quá trình cài đặt, hãy đảm bảo rằng biến môi trường GOPROXY được đặt thành giá trị hợp lệ.

go env -w GOPROXY=https://goproxy.io,direct

Nếu các phương pháp trên không giải quyết vấn đề, hãy xóa bộ nhớ cache của module go:

go clean --modcache

Bắt đầu nhanh

Chế độ chức năng

$ cat main.go
package main

import "github.com/kataras/iris/v12"

func main() {
    // Định nghĩa instance của iris
    app := iris.New()

    // Định nghĩa nhóm route (ở đây định nghĩa nhóm route với tiền tố /books)
    booksAPI := app.Party("/books")
    {
        // Sử dụng middleware
        booksAPI.Use(iris.Compression)

        // Đặt routes và route handlers
        // GET: http://localhost:8080/books
        booksAPI.Get("/", list)
        // POST: http://localhost:8080/books
        booksAPI.Post("/", create)
    }

    // Lắng nghe trên cổng
    app.Listen(":8080")
}

// Ví dụ về sách.
type Book struct {
    Title string `json:"title"`
}

func list(ctx iris.Context) {
    books := []Book{
        {"Mastering Concurrency in Go"},
        {"Go Design Patterns"},
        {"Black Hat Go"},
    }

    ctx.JSON(books)
    // Ghi chú: Đàm phán phản hồi dựa trên ưu tiên của máy chủ và sở thích của máy khách
    // thay vì sử dụng ctx.JSON:
    // ctx.Negotiation().JSON().MsgPack().Protobuf()
    // ctx.Negotiate(books)
}

func create(ctx iris.Context) {
    var b Book
    err := ctx.ReadJSON(&b)
    // Ghi chú: sử dụng ctx.ReadBody(&b) để ràng buộc dữ liệu đầu vào của bất kỳ loại nào.
    if err != nil {
        ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
            Title("Failed to create book").DetailErr(err))
        // Ghi chú: Sử dụng ctx.StopWithError(code, err) khi chỉ mong đợi một phản hồi văn bản thuần túy chỉ trong trường hợp lỗi.
        return
    }

    println("Received book: " + b.Title)

    ctx.StatusCode(iris.StatusCreated)
}

Mô hình kiến trúc MVC

Nhập gói MVC

import "github.com/kataras/iris/v12/mvc"

Thiết lập controller dựa trên nhóm route

m := mvc.New(booksAPI)
m.Handle(new(BookController))

Triển khai Controller

type BookController struct {
    /* Dependency Injection */
}

// Xử lý GET: http://localhost:8080/books
func (c *BookController) Get() []Book {
    return []Book{
        {"Mastering Go Concurrency"},
        {"Go Design Patterns"},
        {"Black Hat Go"},
    }
}

// Xử lý POST: http://localhost:8080/books
func (c *BookController) Post(b Book) int {
    println("Đã nhận sách: " + b.Title)

    return iris.StatusCreated
}

Chạy máy chủ web Iris của bạn:

$ go run main.go
> Đang lắng nghe tại: http://localhost:8080
> Ứng dụng đã khởi động. Nhấn CTRL+C để tắt.

Liệt kê sách:

$ curl --header 'Accept-Encoding:gzip' http://localhost:8080/books

[
  {
    "title": "Mastering Go Concurrency"
  },
  {
    "title": "Go Design Patterns"
  },
  {
    "title": "Black Hat Go"
  }
]

Tạo một sách mới:

$ curl -i -X POST \
--header 'Content-Encoding:gzip' \
--header 'Content-Type:application/json' \
--data "{\"title\":\"Writing an Interpreter in Go\"}" \
http://localhost:8080/books

> HTTP/1.1 201 Created

Đây là một ví dụ về phản hồi lỗi:

$ curl -X POST --data "{\"title\" \"Invalid Book\"}" \
http://localhost:8080/books

> HTTP/1.1 400 Bad Request

{
  "status": 400,
  "title": "Tạo sách thất bại",
  "detail": "ký tự không hợp lệ '\"' sau khóa object"
}