Go實現簡單的RESTful_API

Go實現簡單的RESTful_API

何為RESTful API

A RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data.

A RESTful API – also referred to as a RESTful web service – is based on representational state transfer (REST) technology, an architectural style and approach to communications often used in web services development.

Wikipedia: 表征性狀態傳輸(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士于2000年在他的博士論文中提出來的一種軟件架構風格。
Roy Fielding是HTTP協議(1.0版和1.1版)的主要設計者,事實上HTTP 1.1規范正是基于REST架構風格的指導原理來設計的。需要注意的是,REST是一種設計風格而不是標準,如果一個架構符合REST原則,我們就稱它為RESTful架構。

image

gorilla/mux

golang自帶的http.SeverMux路由實現簡單,本質是一個map[string]Handler,是請求路徑與該路徑對應的處理函數的映射關系。實現簡單功能也比較單一:

  1. 不支持正則路由, 這個是比較致命的
  2. 只支持路徑匹配,不支持按照Method,header,host等信息匹配,所以也就沒法實現RESTful架構

安裝第三方安裝包

go get -u github.com/gorilla/mux

實現

  1. 定義結構體,用戶構造json
type Person struct {ID        string   `json:"id,omitemty"`Firstname string   `json:"firstname,omitempty"`Lastname  string   `json:"lastname,omitempty"`Address   *Address `json:"address,omitempty"`
}type Address struct {City     string `json:"city,omitempty"`Province string `json:"province,omitempty"`
}
  1. 接下來,定義一個全局變量,用于存儲資源(數據):
var people []Person
  1. Get

獲取所有person,這里我們叫people:

func GetPeople(w http.ResponseWriter, req *http.Request) {json.NewEncoder(w).Encode(people)
}

根據id獲取person:

func GetPerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)for _, item := range people {if item.ID == params["id"] {json.NewEncoder(w).Encode(item)return}}json.NewEncoder(w).Encode(people)
}
  1. post

同樣可以,通過post操作向服務器添加數據:

func PostPerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)var person Person_ = json.NewDecoder(req.Body).Decode(&person)person.ID = params["id"]people = append(people, person)json.NewEncoder(w).Encode(people)
}
  1. Delete
func DeletePerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)for index, item := range people {if item.ID == params["id"] {people = append(people[:index], people[index+1:]...)break}}json.NewEncoder(w).Encode(people)
}

完整代碼

package mainimport ("encoding/json""log""net/http""github.com/gorilla/mux"
)type Person struct {ID        string   `json:"id,omitemty"`Firstname string   `json:"firstname,omitempty"`Lastname  string   `json:"lastname,omitempty"`Address   *Address `json:"address,omitempty"`
}type Address struct {City     string `json:"city,omitempty"`Province string `json:"province,omitempty"`
}var people []Person

// *******************************************************************>>
// Get
// 獲取所有person
func GetPeople(w http.ResponseWriter, req *http.Request) {json.NewEncoder(w).Encode(people)
}

// 根據id獲取person
func GetPerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)for _, item := range people {if item.ID == params["id"] {json.NewEncoder(w).Encode(item)return}}json.NewEncoder(w).Encode(people)
}

// <<*******************************************************************

// *******************************************************************>>
// Post
// 通過post操作向服務器添加數據
func PostPerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)var person Person_ = json.NewDecoder(req.Body).Decode(&person)person.ID = params["id"]people = append(people, person)json.NewEncoder(w).Encode(people)
}

// <<*******************************************************************

// *******************************************************************>>
// Delete
// 根據id進行刪除操作
func DeletePerson(w http.ResponseWriter, req *http.Request) {params := mux.Vars(req)for index, item := range people {if item.ID == params["id"] {people = append(people[:index], people[index+1:]...)break}}json.NewEncoder(w).Encode(people)
}

// <<*******************************************************************func main() {people = append(people, Person{ID: "1", Firstname: "xi", Lastname: "dada", Address: &Address{City: "Shenyang", Province: "Liaoning"}})people = append(people, Person{ID: "2", Firstname: "li", Lastname: "xiansheng", Address: &Address{City: "Changchun", Province: "Jinlin"}}) // Get handle function:router := mux.NewRouter()router.HandleFunc("/people", GetPeople).Methods("GET")router.HandleFunc("/people/{id}", GetPerson).Methods("GET") // Post handle functionrouter.HandleFunc("/people/{id}", PostPerson).Methods("POST") // Delete handle function:router.HandleFunc("/people/{id}", DeletePerson).Methods("DELETE") // 啟動 API端口9899log.Fatal(http.ListenAndServe(":9899", router))
}

運行:

go run ***.go

或者編譯成二進制運行

go build ***.go

然后在瀏覽器中測試

http://localhost:9899/people
[{"id":"1","firstname":"xi","lastname":"dada","address":{"city":"Shenyang","province":"Liaoning"}},{"id":"2","firstname":"li","lastname":"xiansheng","address":{"city":"Changchun","province":"Jinlin"}}
]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536086.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536086.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536086.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker使用Dockerfile構建簡單鏡像

Docker使用Dockerfile構建簡單鏡像 首先確保系統已經安裝docker 構建鏡像 安裝基礎鏡像 sudo docker pull ubuntu 查看鏡像是否已經拉取成功 REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu …

Weave Scope安裝

Weave Scope安裝 首先確保已經安裝docker 實時了解Docker容器狀態 查看容器基礎設施的概況&#xff0c;或者專注于一個特殊的微服務。從而輕松發現并糾正問題&#xff0c;確保你的容器化應用的穩定與性能。 內部細節與深度鏈接 查看容器的指標、標簽和元數據。 在一個可擴展…

MYSQL導入數據出現ERROR 1049 (42000): Unknown database 'n??;'

MYSQL導入數據出現ERROR 1049 (42000): Unknown database ‘n??;’ 背景 我需要將一個csv表中的數據導入數據庫創建好的表中&#xff0c;產生的問題如下&#xff1a; 原因尋找 因為我并沒有使用’n??;的數據庫&#xff0c;所以很好奇這個錯怎么來的&#xff0c;嘗試如下…

Win10忘記ubuntu子系統密碼

Win10忘記ubuntu子系統密碼 目前新版win10已經支持ubuntu子系統&#xff0c;如果忘記子系統密碼怎么辦&#xff1f; linux單用戶模式 在ubuntu中如果忘記密碼&#xff0c;可以在啟動的時候&#xff0c;在grub內更改用戶為root進入&#xff0c;這樣就可以使用最高權限的單用戶…

藍橋杯練習系統,入門訓練,Java版

藍橋杯練習系統&#xff0c;入門訓練&#xff0c;Java版序列求和圓的面積Fibonacci數列希望大家提建議我加以修改序列求和 import java.util.*; public class Main {public static void main(String[] args) {Scanner cinnew Scanner(System.in);long ncin.nextLong();System.…

SVG入門理解

SVG入門SVG 元素簡單的形狀rectcircleellipselinetextpath SVG 樣式分層和繪圖順序透明度 SVG入門 當我們用SVG生成和操作一些炫酷的效果時,D3是最佳選擇。使用div和其他原生HTML元素繪圖也是可以的&#xff0c;但是太笨重&#xff0c;而且會受到不同瀏覽器的限制&#xff0c…

【哈佛幸福課筆記】【1】

【哈佛幸福課筆記】【1】 ? ? 一個月的時間看完了哈佛幸福課&#xff0c;正如Tal所說課程的結束才是學習的開始。對于課程觀點的思考&#xff0c;對于個人習慣的培養&#xff0c;對于思維模式的轉變還需要花大量的時間去練習。這個系列的帖子將作為我個人的讀書筆記&#x…

Angular 6+ 之新版service

Angular 6+ 之新版service Angular 6已經發布了,Angular 6中有一些新功能,其中一個就是提供service的共享實例。 回首Angular 5- 下面是一段熟悉的代碼,可以為整個應用程序提供服務。我們將它添加到AppModule中的providers[]。 自定義服務類 // data.service.ts export c…

Angular CDK Layoout 檢測斷點

Angular CDK檢測斷點 Angular CDK有一個布局包,其服務可以輕松檢測窗口大小并與媒體查詢匹配。這使得你可以完全控制UI并適應不同的屏幕尺寸。 讓我們快速了解一下如何使用CDK的布局模塊。 Setup 首先,您需要確保在您的應用中安裝了Angular CDK: $ npm install @angular/c…

Angular Render2

Angular Render2 Renderer2類是Angular以service的形式提供的抽象,允許操作應用程序的元素而無需直接觸摸DOM。這是推薦的方法,因為它可以更容易地開發可以在沒有DOM訪問的環境中呈現的應用程序,例如在服務器上,web worker,或者原生移動上。 需要注釋的是,現在已棄用原始…

數據分析方法

數據分析方法 什么是數據分析 從數據到信息的這個過程&#xff0c;就是數據分析。數據本身并沒有什么價值&#xff0c;有價值的是我們從數據中提取出來的信息。 分類 分類分析的目標是&#xff1a;給一批人(或者物)分成幾個類別&#xff0c;或者預測他們屬于每個類別的概率…

RAID陣列基礎知識

RAID陣列基礎知識 獨立硬盤冗余陣列 &#xff08;RAID, Redundant Array of Independent Disks&#xff09;,舊稱廉價磁盤冗余陣列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;簡稱磁盤陣列。 RAID的種類 這里我們只介紹比較常用的RAID類型&am…

timeshift備份你的Linux系統

timeshift備份你的Linux系統 安裝 打開終端&#xff08;ctrl alt T&#xff09;并逐個執行以下命令 sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt-get update sudo apt-get install timeshift 創建 點擊Create按鈕 默認不能備份用戶下的文件&#xff0c;所以…

Go語言vscode環境配置

Go語言vscode環境配置 此教程在GO已經安裝成功的前提下。 安裝vscode擴展 在vscode擴展里面搜索go&#xff0c;然后下載擴展。 安裝go 插件 在$GOPATH目錄下創建bin,pkg,src切換到$GOPATH/bin目錄下&#xff0c;打開終端輸入以下命令&#xff0c;不需要翻墻&#xff1a; go…

Angular實現懸浮球組件

Angular實現懸浮球組件 在手機 App 上,我們經常會看到懸浮球的東東,用著可能很舒服,但是 web 網頁上卻很少見,今天我們就通過 Angular 來實現,當然使用其他框架也是可以的。 功能要求: 支持設置直徑支持點擊觸發信號支持設置鼠標按壓時間實現的過程中省略的部分天填坑過…

Docker+Nginx部署Angular國際化i18n

Docker+Nginx部署Angular國際化i18n 在Angular項目中添加default.conf文件 default.conf 為了支持局域網,增加一個域名,即本地的局域網ip地址。 server {listen 80;server_name localhost;server_name 192.168.2.172;location / {root /usr/share/nginx/html;lo…

消息隊列-Message Queue

消息隊列-Message Queue 目前隨著互聯網的普及以及上網用戶的增多&#xff0c;擁有一套 安全、穩定、低耦合、高性能的內部通信工具尤為重要。 什么是消息隊列&#xff1f; 消息隊列&#xff08;英語&#xff1a;Message queue&#xff09;是一種進程間通信或同一進程的不同線…

Angular 第一章 開始

第一章 開始 用 JavaScript 開發應用程序是一個很大的挑戰。由于它的延展性和缺少類型檢查,在 JavaScript 中構建一個適當大小的應用程序是很困難的。除此之外,我們對所有類型的處理都使用JavaScript,例如用戶界面(UI),操作、客戶端-服務器交互和業務處理/驗證。因此,我們…

Typescript實現單例之父類調用子類

Typescript實現單例之父類調用子類 設計要求 在程序中,需要一個對象可以全局使用,并且只有一個實例Breakpoint 類是一個可以被繼承的類,然后子類必須實現 updateView函數updateView 這個函數可以被自動調用,當窗口發生變化的時候構思 UML 圖 Layout 是一個單例類,也就是全局只…

Angular性能優化之臟檢測

Angular性能優化之臟檢測 當我們在使用 Angular 框架搭建項目時,隨著組件越來越多,頁面也來越復雜,性能會越來越低,主要表現在 CPU 使用率 很高。所以我們要對項目做一定的優化。 Angular臟檢查(Change Detection)機制 Angular 的臟檢測主要是指 zone.js,這是一個開源的…