Resetful API的詳細闡述

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QBLLU的頭像QBLLU
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相關推薦

  • 掌握magic-api item.import,為你的項目注入靈魂

    你是否曾經想要導入一個模塊,但卻不知道如何實現?又或者,你是否在使用magic-api時遇到了無法導入的問題?那麼,你來到了正確的地方。在本文中,我們將詳細闡述magic-api的…

    編程 2025-04-29
  • Vertx網關:高效率的API網關中心

    Vertx是一個基於JVM的響應式編程框架,是最適合創建高擴展和高並發應用程序的框架之一。同時Vertx也提供了API網關解決方案,即Vertx網關。本文將詳細介紹Vertx網關,…

    編程 2025-04-28
  • Elasticsearch API使用用法介紹-get /_cat/allocation

    Elasticsearch是一個分布式的開源搜索和分析引擎,支持全文檢索和數據分析,並且可伸縮到上百個節點,處理PB級結構化或非結構化數據。get /_cat/allocation…

    編程 2025-04-28
  • 解析Azkaban API Flow執行結果

    本文將從多個方面對Azkaban API Flow執行結果進行詳細闡述 一、Flow執行結果的返回值 在調用Azkaban API的時候,我們一般都會通過HTTP請求獲取Flow執…

    編程 2025-04-27
  • index.html怎麼打開 – 詳細解析

    一、index.html怎麼打開看 1、如果你已經擁有了index.html文件,那麼你可以直接使用任何一個現代瀏覽器打開index.html文件,比如Google Chrome、…

    編程 2025-04-25
  • 高德拾取——地圖API中的強大工具

    一、高德拾取介紹 高德拾取是高德地圖API中的一項重要工具,它可以幫助開發者在地圖上快速選擇經緯度點,並提供多種方式來獲取這些點的信息,例如批量獲取坐標的地理位置、測量兩個或多個點…

    編程 2025-04-25
  • 關鍵路徑的詳細闡述

    關鍵路徑是項目管理中非常重要的一個概念,它通常指的是項目中最長的一條路徑,它決定了整個項目的完成時間。在這篇文章中,我們將從多個方面對關鍵路徑做詳細的闡述。 一、概念 關鍵路徑是指…

    編程 2025-04-25
  • neo4j菜鳥教程詳細闡述

    一、neo4j介紹 neo4j是一種圖形數據庫,以實現高效的圖操作為設計目標。neo4j使用圖形模型來存儲數據,數據的表述方式類似於實際世界中的網絡。neo4j具有高效的讀和寫操作…

    編程 2025-04-25
  • AXI DMA的詳細闡述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基於AMBA…

    編程 2025-04-25
  • c++ explicit的詳細闡述

    一、explicit的作用 在C++中,explicit關鍵字可以在構造函數聲明前加上,防止編譯器進行自動類型轉換,強制要求調用者必須強制類型轉換才能調用該函數,避免了將一個參數類…

    編程 2025-04-25

發表回復

登錄後才能評論