欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言使用net/http構(gòu)建一個(gè)RESTful?API的示例代碼

 更新時(shí)間:2025年08月12日 08:27:25   作者:程序員愛釣魚  
Go的標(biāo)準(zhǔn)庫net/http提供了構(gòu)建Web服務(wù)所需的強(qiáng)大功能,雖然眾多第三方框架(如?Gin、Echo)已經(jīng)封裝了很多功能,但如果你真正想理解?Go的底層Web服務(wù)機(jī)制,那么使用net/http實(shí)現(xiàn)一個(gè)原生的RESTful?API?是最好的入門方式,需要的朋友可以參考下本文

引言

Go 的標(biāo)準(zhǔn)庫 net/http 提供了構(gòu)建 Web 服務(wù)所需的強(qiáng)大功能。雖然眾多第三方框架(如 Gin、Echo)已經(jīng)封裝了很多功能,但如果你真正想理解 Go 的底層 Web 服務(wù)機(jī)制,那么使用 net/http 實(shí)現(xiàn)一個(gè)原生的 RESTful API 是最好的入門方式。

本文將通過一個(gè)實(shí)戰(zhàn)案例:構(gòu)建一個(gè)用戶信息管理 API,帶你從零開始打造 RESTful 服務(wù)。

一、什么是 RESTful API?

REST(Representational State Transfer)是一種軟件架構(gòu)風(fēng)格,常用于 Web API 的設(shè)計(jì)。

常見 HTTP 方法與操作語義:

方法語義說明
GET獲取資源讀取某個(gè)資源的內(nèi)容
POST創(chuàng)建資源向服務(wù)器添加新資源
PUT更新資源修改已有資源
DELETE刪除資源移除某個(gè)資源

二、實(shí)戰(zhàn)目標(biāo):用戶信息管理 API

我們將構(gòu)建以下功能的 API:

  • GET /users:獲取用戶列表
  • GET /users/{id}:獲取指定用戶
  • POST /users:創(chuàng)建新用戶
  • PUT /users/{id}:更新用戶
  • DELETE /users/{id}:刪除用戶

三、代碼實(shí)現(xiàn)

1. 用戶數(shù)據(jù)結(jié)構(gòu)

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "math/rand"
    "net/http"
    "strconv"
    "strings"
    "sync"
)

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

var (
    users   = make(map[int]User)
    mu      sync.Mutex
)

2. 工具函數(shù):ID提取

func parseID(path string) (int, error) {
    parts := strings.Split(path, "/")
    if len(parts) < 3 {
        return 0, fmt.Errorf("invalid path")
    }
    return strconv.Atoi(parts[2])
}

3. 處理函數(shù)

func usersHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    switch r.Method {
    case "GET":
        // 獲取所有用戶
        mu.Lock()
        list := make([]User, 0, len(users))
        for _, user := range users {
            list = append(list, user)
        }
        mu.Unlock()
        json.NewEncoder(w).Encode(list)

    case "POST":
        // 創(chuàng)建用戶
        var user User
        if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }
        user.ID = rand.Intn(10000)
        mu.Lock()
        users[user.ID] = user
        mu.Unlock()
        json.NewEncoder(w).Encode(user)

    default:
        http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
    }
}
func userHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    id, err := parseID(r.URL.Path)
    if err != nil {
        http.Error(w, "Invalid ID", http.StatusBadRequest)
        return
    }

    mu.Lock()
    user, exists := users[id]
    mu.Unlock()

    switch r.Method {
    case "GET":
        if !exists {
            http.NotFound(w, r)
            return
        }
        json.NewEncoder(w).Encode(user)

    case "PUT":
        if !exists {
            http.NotFound(w, r)
            return
        }
        var updated User
        if err := json.NewDecoder(r.Body).Decode(&updated); err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }
        updated.ID = id
        mu.Lock()
        users[id] = updated
        mu.Unlock()
        json.NewEncoder(w).Encode(updated)

    case "DELETE":
        if !exists {
            http.NotFound(w, r)
            return
        }
        mu.Lock()
        delete(users, id)
        mu.Unlock()
        w.WriteHeader(http.StatusNoContent)

    default:
        http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
    }
}

4. 主函數(shù)啟動服務(wù)

func main() {
    http.HandleFunc("/users", usersHandler)
    http.HandleFunc("/users/", userHandler)

    fmt.Println("服務(wù)啟動中: http://localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

四、測試方式(推薦使用 curl 或 Postman)

# 創(chuàng)建用戶
curl -X POST -H "Content-Type: application/json" \
     -d '{"name":"Tom","age":25}' http://localhost:8080/users

# 獲取所有用戶
curl http://localhost:8080/users

# 獲取指定用戶
curl http://localhost:8080/users/1234

# 更新用戶
curl -X PUT -H "Content-Type: application/json" \
     -d '{"name":"Jerry","age":30}' http://localhost:8080/users/1234

# 刪除用戶
curl -X DELETE http://localhost:8080/users/1234

五、總結(jié)與建議

通過本案例,我們學(xué)習(xí)了如何用 Go 原生的 net/http

  • ? 實(shí)現(xiàn) RESTful 風(fēng)格的接口
  • ? 處理不同的 HTTP 方法
  • ? 編解碼 JSON 數(shù)據(jù)
  • ? 線程安全地管理數(shù)據(jù)結(jié)構(gòu)

雖然這個(gè)例子是最基礎(chǔ)的,但它奠定了你進(jìn)一步使用更強(qiáng)大框架(如 Gin、Echo)的基礎(chǔ)。

六、進(jìn)階推薦

  • 加入中間件(如日志、認(rèn)證)
  • 使用 context 處理請求生命周期
  • 支持 URL 參數(shù)和 Query 參數(shù)
  • 使用第三方路由庫如 gorilla/mux
  • 數(shù)據(jù)存儲替換為數(shù)據(jù)庫(如 GORM + MySQL)

以上就是Go語言使用net/http構(gòu)建一個(gè)RESTful API的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Go net/http構(gòu)建RESTful API的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go語言import報(bào)錯(cuò)處理圖文詳解

    go語言import報(bào)錯(cuò)處理圖文詳解

    今天本來想嘗試一下go語言中公有和私有的方法,結(jié)果import其他包的時(shí)候直接報(bào)錯(cuò)了,下面這篇文章主要給大家介紹了關(guān)于go語言import報(bào)錯(cuò)處理的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 使用Go語言編寫一個(gè)毫秒級生成組件庫文檔工具

    使用Go語言編寫一個(gè)毫秒級生成組件庫文檔工具

    在開發(fā)組件庫的過程中,文檔無疑是不可或缺的一環(huán),在本文中將嘗試將Go語言與前端技術(shù)巧妙融合,以創(chuàng)建一款能在毫秒級別完成文檔生成的工具,需要的可以參考下
    2024-03-03
  • GoLang抽獎系統(tǒng)簡易實(shí)現(xiàn)流程

    GoLang抽獎系統(tǒng)簡易實(shí)現(xiàn)流程

    這篇文章主要介紹了GoLang抽獎系統(tǒng)實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • 優(yōu)雅使用GoFrame共享變量Context示例詳解

    優(yōu)雅使用GoFrame共享變量Context示例詳解

    這篇文章主要為大家介紹了優(yōu)雅使用GoFrame共享變量Context示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語言如何利用Mutex保障數(shù)據(jù)讀寫正確

    Go語言如何利用Mutex保障數(shù)據(jù)讀寫正確

    這篇文章主要介紹了互斥鎖的實(shí)現(xiàn)機(jī)制,以及?Go?標(biāo)準(zhǔn)庫的互斥鎖?Mutex?的基本使用方法,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2023-05-05
  • Golang接口使用教程詳解

    Golang接口使用教程詳解

    在?Go?語言中接口包含兩種含義:它既是方法的集合,?同時(shí)還是一種類型并且在Go?語言中是隱式實(shí)現(xiàn)的。本文通過示例詳細(xì)介紹了Golang接口的使用,需要的可以參考一下
    2022-09-09
  • golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    在?Go?語言中,您可以使用?os/exec?包來執(zhí)行外部命令,不通過調(diào)用?shell,并且能夠獲得進(jìn)程的退出碼、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出,下面給大家分享golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)的方法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Go語言中的goroutine和channel如何協(xié)同工作

    Go語言中的goroutine和channel如何協(xié)同工作

    在Go語言中,goroutine和channel是并發(fā)編程的兩個(gè)核心概念,它們協(xié)同工作以實(shí)現(xiàn)高效、安全的并發(fā)執(zhí)行,本文將詳細(xì)探討goroutine和channel如何協(xié)同工作,以及它們在并發(fā)編程中的作用和優(yōu)勢,需要的朋友可以參考下
    2024-04-04
  • golang中的空slice案例

    golang中的空slice案例

    這篇文章主要介紹了golang中的空slice案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang構(gòu)建工具M(jìn)akefile使用詳解

    golang構(gòu)建工具M(jìn)akefile使用詳解

    這篇文章主要為大家介紹了golang構(gòu)建工具M(jìn)akefile的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評論