一、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/n/373197.html