以下是一个基于 Golang 的简单的 RESTful API,用于处理图书信息:
package main
import (
"encoding/json"
"log"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
type book struct {
ID int `json:"id"`
Title string `json:"title"`
Author string `json:"author"`
}
var books []book = []book{
book{1, "The Great Gatsby", "F. Scott Fitzgerald"},
book{2, "To Kill a Mockingbird", "Harper Lee"},
book{3, "1984", "George Orwell"},
}
func main() {
router := mux.NewRouter()
router.HandleFunc("/books", allBooks).Methods("GET")
router.HandleFunc("/books/{id}", oneBook).Methods("GET")
router.HandleFunc("/books", addBook).Methods("POST")
router.HandleFunc("/books/{id}", updateBook).Methods("PUT")
router.HandleFunc("/books/{id}", deleteBook).Methods("DELETE")
log.Fatal(http.ListenAndServe(":8000", router))
}
func allBooks(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(books)
}
func oneBook(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, err := strconv.Atoi(params["id"])
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
for _, b := range books {
if b.ID == id {
json.NewEncoder(w).Encode(b)
return
}
}
w.WriteHeader(http.StatusNotFound)
}
func addBook(w http.ResponseWriter, r *http.Request) {
var newBook book
err := json.NewDecoder(r.Body).Decode(&newBook)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
newBook.ID = len(books) + 1
books = append(books, newBook)
json.NewEncoder(w).Encode(newBook)
}
func updateBook(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, err := strconv.Atoi(params["id"])
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
var updatedBook book
err = json.NewDecoder(r.Body).Decode(&updatedBook)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
for i, b := range books {
if b.ID == id {
updatedBook.ID = id
books[i] = updatedBook
json.NewEncoder(w).Encode(updatedBook)
return
}
}
w.WriteHeader(http.StatusNotFound)
}
func deleteBook(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, err := strconv.Atoi(params["id"])
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
for i, b := range books {
if b.ID == id {
books = append(books[:i], books[i+1:]...)
w.WriteHeader(http.StatusNoContent)
return
}
}
w.WriteHeader(http.StatusNotFound)
}
此 API 支持以下操作:
- 获取所有图书信息
- 获取单个图书信息
- 添加新的图书信息
- 更新某个图书信息
- 删除某个图书信息
使用 gorilla/mux
包来管理路由和请求处理。使用一个 book
结构体表示图书,并使用切片存储图书列表。在处理 GET 请求时,我们可以使用 json
包将数据编码为 JSON 格式返回给客户端。在处理 POST 和 PUT 请求时,我们可以使用 json
包将请求体解码为 book
结构体,并根据需要更新或添加到切片中。在处理 DELETE 请求时,我们可以使用 append
函数从切片中删除指定的元素。
请注意,此代码是一个简单的示例,也许还需要进行更多的优化和错误处理才能在生产环境中使用。