文章目录
- 实现基本HTTP谓词操作
- 1 目标
- 2 步骤
- 2.1 安装依赖
- 2.2 代码
实现基本HTTP谓词操作
1 目标
实现基本HTTP谓词操作。
HTTP 谓词 | 功能 | 用途 | 示例 |
---|---|---|---|
GET | 获取资源 | 从服务器检索数据,不会对服务器上的数据产生任何影响 | 获取所有项目:GET /items 获取指定ID的项目:GET /items/1 |
POST | 创建资源 | 向服务器发送数据,并在服务器上创建新的资源 | 添加新项目:POST /items 请求体:{ “name”: “New Item”, “description”: “New Description” } |
PUT | 更新资源(替换整个资源) | 替换服务器上的现有资源 | 更新项目:PUT /items/1 请求体:{ “name”: “Updated Item”, “description”: “Updated Description” } |
PATCH | 更新资源(部分更新资源) | 更新服务器上的现有资源的部分内容 | 部分更新项目:PATCH /items/1 请求体:{ “description”: “Partially Updated Description” } |
DELETE | 删除资源 | 从服务器上删除指定资源 | 删除项目:DELETE /items/1 |
2 步骤
2.1 安装依赖
在运行此代码之前,请确保你已经安装了 Gorilla Mux 包。使用以下命令来安装它:
go get -u github.com/gorilla/mux
2.2 代码
package main
import (
"encoding/json"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
// Item 代表一个数据项的结构体
type Item struct {
ID int `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
}
// 示例数据
var items = []Item{
{ID: 1, Name: "Item 1", Description: "Description 1"},
{ID: 2, Name: "Item 2", Description: "Description 2"},
}
func main() {
r := mux.NewRouter()
// 路由设置
r.HandleFunc("/items", getItems).Methods("GET") // 获取所有项目
r.HandleFunc("/items/{id:[0-9]+}", getItem).Methods("GET") // 根据ID获取项目
r.HandleFunc("/items", addItem).Methods("POST") // 添加新项目
r.HandleFunc("/items/{id:[0-9]+}", updateItem).Methods("PUT") // 更新项目(替换整个项目)
r.HandleFunc("/items/{id:[0-9]+}", patchItem).Methods("PATCH") // 部分更新项目
r.HandleFunc("/items/{id:[0-9]+}", deleteItem).Methods("DELETE") // 删除项目
http.ListenAndServe(":3000", r) // 启动服务器
}
// 获取所有项目的处理函数
func getItems(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(items)
}
// 根据ID获取项目的处理函数
func getItem(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
for _, item := range items {
if item.ID == id {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(item)
return
}
}
http.Error(w, "Item not found", http.StatusNotFound)
}
// 添加新项目的处理函数
func addItem(w http.ResponseWriter, r *http.Request) {
var newItem Item
json.NewDecoder(r.Body).Decode(&newItem)
newItem.ID = len(items) + 1
items = append(items, newItem)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(newItem)
}
// 更新项目(替换整个项目)的处理函数
func updateItem(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
for index, item := range items {
if item.ID == id {
var updatedItem Item
json.NewDecoder(r.Body).Decode(&updatedItem)
updatedItem.ID = id
items[index] = updatedItem
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(updatedItem)
return
}
}
http.Error(w, "Item not found", http.StatusNotFound)
}
// 部分更新项目的处理函数
func patchItem(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
for index, item := range items {
if item.ID == id {
var patchData map[string]interface{}
json.NewDecoder(r.Body).Decode(&patchData)
if name, ok := patchData["name"].(string); ok {
item.Name = name
}
if description, ok := patchData["description"].(string); ok {
item.Description = description
}
items[index] = item
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(item)
return
}
}
http.Error(w, "Item not found", http.StatusNotFound)
}
// 删除项目的处理函数
func deleteItem(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
for index, item := range items {
if item.ID == id {
items = append(items[:index], items[index+1:]...)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(item)
return
}
}
http.Error(w, "Item not found", http.StatusNotFound)
}