首先这是一个非常简单的增删改查系统,通过请求路径的不同以及请求方式的不同来做不同的操作。这边主要是使用GO语言实现以下,熟悉GO语言的语法,以及一些标准库和第三方包的使用。
1、这里使用到了一个第三方包:github.com/gorilla/mux
,这是一个强大的请求路由器,用于将传入的HTTP请求映射到对应的处理函数上,还支持路由的路径变量、子路由、路由中间件、请求主机、查询字符串等高级功能。
2、简单学习了encoding标准库中处理json数据的方法,使用json.NewEncoder(w).Encode(movies)
将movies切片编码成json格式,并写入io.Writer中。
下面直接上代码:
package main
import (
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"log"
rand "math/rand"
"net/http"
"strconv"
)
// 电影结构体
type Movie struct {
ID string `json:"id"`
Isbn string `json:"isbn"`
Title string `json:"title"`
Director *Director `json:"director"`
}
// 导演结构体
type Director struct {
Firstname string `json:"firstname"`
Lastname string `json:"lastname"`
}
// 定义一个电影的切片
var movies []Movie
// 获取所有电影信息
func getMovies(w http.ResponseWriter, r *http.Request) {
//设置http响应字段“Content-Type”为“application/json"
w.Header().Set("Content-Type", "application/json")
//将切片编码为json并返回
json.NewEncoder(w).Encode(movies)
}
// 根据id删除电影
func deleteMovie(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
//从请求中提取路径参数,Vars函数将请求中的路径参数解析为一个map,所以这个params一个map,可以根据参数名来获取参数
params := mux.Vars(r)
//遍历切片
for index, item := range movies {
if item.ID == params["id"] {
//将匹配的movie从切片删除 [:index]代表index之前的所有元素,[index+1:]...代表index之后的所有元素
movies = append(movies[:index], movies[index+1:]...)
break
}
}
//返回所有电影
json.NewEncoder(w).Encode(movies)
}
// 根据id所有movies
func getMovie(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
params := mux.Vars(r)
for _, item := range movies {
if item.ID == params["id"] {
//返回id匹配的电影
json.NewEncoder(w).Encode(item)
return
}
}
}
// 创建一个电影
func createMovie(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var movie Movie
//解码请求体
_ = json.NewDecoder(r.Body).Decode(&movie)
//设置movie的id
movie.ID = strconv.Itoa(rand.Intn(1000000))
//将新的movie添加到切片
movies = append(movies, movie)
json.NewEncoder(w).Encode(movies)
}
// 根据id更新movie
func updateMovie(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var movie Movie
_ = json.NewDecoder(r.Body).Decode(&movie)
for index, item := range movies {
//匹配id相同的电影
if item.ID == movie.ID {
movies[index] = movie
}
}
json.NewEncoder(w).Encode(movies)
}
func main() {
r := mux.NewRouter()
movies = append(movies, Movie{ID: "1", Isbn: "12345", Title: "肖生客的救赎", Director: &Director{Firstname: " Frank Darabont", Lastname: "Frank"}})
movies = append(movies, Movie{ID: "2", Isbn: "23456", Title: "奥本海默", Director: &Director{Firstname: "Christopher Nolan", Lastname: "Christopher"}})
movies = append(movies, Movie{ID: "3", Isbn: "34567", Title: "泰坦尼克号", Director: &Director{Firstname: "James Cameron", Lastname: "James"}})
r.HandleFunc("/movies", getMovies).Methods("GET")
r.HandleFunc("/movies/{id}", getMovie).Methods("GET")
r.HandleFunc("/movies/", createMovie).Methods("POST")
r.HandleFunc("/movies/{id}", updateMovie).Methods("PUT")
r.HandleFunc("/movies/{id}", deleteMovie).Methods("DELETE")
fmt.Printf("Starting server at port 8000\n")
log.Fatal(http.ListenAndServe("localhost:8000", r))
}