一、Resetful API簡介
Resetful(REpresentational State Transfer)是一種基於HTTP協議的Web API設計風格,它是一種輕量級的Web服務框架,可用於構建Web服務實現數據交換。
Resetful API是建立在Resetful架構上的Web API,它的優勢是快速、簡單、易於使用和維護,對於Web開發人員而言,是一種特別方便的開發方式,使得多個各種類型軟件的前後端可以很容易地進行集成和連接。
Resetful API具備以下特點:
1、基於HTTP協議,符合HTTP的標準方法和規範;
2、採用URI標識資源,例如:/user/123;
3、使用HTTP方法GET, POST, PUT, DELETE實現資源統一操作,例如:查看用戶信息、添加用戶、更新用戶信息、刪除用戶;
4、請求類型和資源狀態都通過HTTP頭來傳遞,例如:Content-Type、ETag等;
5、使用HTTP狀態碼來表示響應狀態。
二、Resetful API的核心原則
Resetful API的核心原則如下:
1、資源:所有需要被管理的事物都被視為資源,例如用戶、文章、訂單等等;
2、操作:對資源的操作使用HTTP方法實現,即GET、POST、PUT、DELETE,例如獲取用戶信息用GET請求,添加用戶信息用POST請求,更新用戶信息用PUT請求,刪除用戶信息用DELETE請求;
3、表現層:資源通過mime類型進行描述,資源的操作只能通過一個URI(Uniform Resource Identifier)來訪問,例如:/user/123;
4、鏈接:資源之間的關係通過鏈接來表示;
5、無狀態:每個請求都是獨立的,請求不會影響到資源本身的狀態,每個請求都必須包含足夠的信息,以便服務器能夠立即理解請求的意圖。
三、Resetful API的創建流程
1、確定資源:
如果要創建Resetful API,首先需要確定需要被服務化的資源,這些資源可以是用戶、文章、訂單、照片、音樂等等。
例如我們要創建一個用戶管理的Resetful API,我們需要讓用戶資源暴露出來,這樣用戶可以使用HTTP方法來訪問資源。
2、創建URI
創建URI是非常關鍵的一步,你需要為每種資源創建一個可訪問的URI,例如:/user/123。URI必須符合HTTP標準,且儘可能直觀和容易理解,保證URI的唯一性和對資源的準確證明。
3、確定HTTP方法
利用HTTP方法對資源進行操作,有一個通用的方法名稱可以使用,分別是GET、POST、PUT和DELETE。HTTP方法的使用應該使請求處理更具有可讀性,且能夠被緩存、限流、安全地操作。
4、請求和響應設計
設計好請求和響應是創建一個Resetful接口的關鍵,重要的請求屬性應包括:標識資源的URI、必需屬性、可選屬性和任何涉及非資源特定信息的請求標頭或路徑。請求中的屬性是指資源的狀態,例如:用戶信息。
響應應該包括頂級元素編排、HTTP狀態碼、任何可選的標頭元素以及表示了資源狀態的元素。每個響應中都應該包含足夠的信息以定義狀態和錯誤處理。
四、Resetful API的示例代碼
package main
import (
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"log"
"net/http"
"strconv"
)
type book struct {
ID int 'json:"id,omitempty"'
Title string 'json:"title,omitempty"'
Author string 'json:"author,omitempty"'
Year int 'json:"year,omitempty"'
}
var books []book
func GetBooks(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(books)
}
func GetBook(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
for _, item := range books {
i, err := strconv.Atoi(params["id"])
if err == nil && item.ID == i {
json.NewEncoder(w).Encode(item)
return
}
}
json.NewEncoder(w).Encode(&book{})
}
func CreateBook(w http.ResponseWriter, r *http.Request) {
var book book
_ = json.NewDecoder(r.Body).Decode(&book)
books = append(books, book)
json.NewEncoder(w).Encode(book)
}
func UpdateBook(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
for i, item := range books {
id, _ := strconv.Atoi(params["id"])
if item.ID == id {
var book book
_ = json.NewDecoder(r.Body).Decode(&book)
books[i] = book
json.NewEncoder(w).Encode(book)
return
}
}
json.NewEncoder(w).Encode(books)
}
func DeleteBook(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
for i, item := range books {
id, _ := strconv.Atoi(params["id"])
if item.ID == id {
books = append(books[:i], books[i+1:]...)
break
}
}
json.NewEncoder(w).Encode(books)
}
func main() {
router := mux.NewRouter()
books = append(books, book{ID: 1, Title: "Golang for Beginners", Author: "John Doe", Year: 2021})
books = append(books, book{ID: 2, Title: "React Native Development", Author: "Mary Jane", Year: 2020})
router.HandleFunc("/books", GetBooks).Methods("GET")
router.HandleFunc("/book/{id}", GetBook).Methods("GET")
router.HandleFunc("/book", CreateBook).Methods("POST")
router.HandleFunc("/book/{id}", UpdateBook).Methods("PUT")
router.HandleFunc("/book/{id}", DeleteBook).Methods("DELETE")
fmt.Println("Starting server...")
log.Fatal(http.ListenAndServe(":8000", router))
}
原創文章,作者:QBLLU,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/373197.html