Golang - #002 实现基本HTTP谓词操作

文章目录

  • 实现基本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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满天飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值