restfull知識點

網絡應用程序,分為前端和后端兩個部分。當前的發展趨勢,就是前端設備層出不窮(手機、平板、桌面電腦、其他專用設備......)。因此,必須有一種統一的機制,方便不同的前端設備與后端進行通信。這導致API構架的流行,甚至出現"API First"的設計思想。
RESTful API是目前比較成熟的一套互聯網應用程序的API設計理論

RESTful API的相關規定

一、協議
API與用戶的通信協議,總是使用HTTPs協議

二、域名
應該盡量將API部署在專用域名之下
https://api.example.com
如果確定API很簡單,不會有進一步擴展,可以考慮放在主域名下
https://example.org/api/

三、版本(Versioning)
應該將API的版本號放入URL
https://api.example.com/v1/

四、路徑(Endpoint)----說白了就是url,每一個資源都有一個url與之一一對應
路徑又稱"終點"(endpoint),表示API的具體網址。
在RESTful架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞,而且所用的名詞往往與數據庫的表格名對應。
一般來說,數據庫中的表都是同種記錄的"集合"(collection),所以API中的名詞也應該使用復數。
舉例來說,有一個API提供動物園(zoo)的信息,還包括各種動物和雇員的信息,則它的路徑應該設計成下面這樣
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

五、HTTP動詞
對于資源的具體操作類型,由HTTP動詞表示。
常用的HTTP動詞有下面五個(括號里是對應的SQL命令)
GET(SELECT):從服務器取出資源(一項或多項)。
POST(CREATE):在服務器新建一個資源。
PUT(UPDATE):在服務器更新資源(客戶端提供改變后的完整資源)。
PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。----這個動詞只是提供改變的部分
DELETE(DELETE):從服務器刪除資源。
還有兩個不常用的HTTP動詞
HEAD:獲取資源的元數據。
OPTIONS:獲取信息,關于資源的哪些屬性是客戶端可以改變的。

下面是一些例子
GET /zoos:列出所有動物園
POST /zoos:新建一個動物園
GET /zoos/ID:獲取某個指定動物園的信息
PUT /zoos/ID:更新某個指定動物園的信息(提供該動物園的全部信息)
PATCH /zoos/ID:更新某個指定動物園的信息(提供該動物園的部分信息)
DELETE /zoos/ID:刪除某個動物園
GET /zoos/ID/animals:列出某個指定動物園的所有動物
DELETE /zoos/ID/animals/ID:刪除某個指定動物園的指定動物

六、過濾信息(Filtering)---其實就是在url中增加一些參數,視圖函數通過獲取這些關鍵字而做一些相應的動作
如果記錄數量很多,服務器不可能都將它們返回給用戶。API應該提供參數,過濾返回結果。
下面是一些常見的參數
?limit=10:指定返回記錄的數量
?offset=10:指定返回記錄的開始位置。
?page=2&per_page=100:指定第幾頁,以及每頁的記錄數。
?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序。
?animal_type_id=1:指定篩選條件
參數的設計允許存在冗余,即允許API路徑和URL參數偶爾有重復。比如,GET /zoo/ID/animals 與 GET /animals?zoo_id=ID 的含義是相同的。
(就是不同的url形式)

七、狀態碼(Status Codes)
服務器向用戶返回的狀態碼和提示信息,常見的有以下一些(方括號中是該狀態碼對應的HTTP動詞)
200 OK - [GET]:服務器成功返回用戶請求的數據,該操作是冪等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
202 Accepted - [*]:表示一個請求已經進入后臺排隊(異步任務)
204 NO CONTENT - [DELETE]:用戶刪除數據成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操作,該操作是冪等的。
401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
403 Forbidden - [*] 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的。
404 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操作,該操作是冪等的。
406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 當創建一個對象時,發生一個驗證錯誤。
500 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將無法判斷發出的請求是否成功

八、錯誤處理(Error handling)
如果狀態碼是4xx,就應該向用戶返回出錯信息。一般來說,返回的信息中將error作為鍵名,出錯信息作為鍵值即可。
{
error: "Invalid API key"
}

九、返回結果
針對不同操作,服務器向用戶返回的結果應該符合以下規范
GET /collection:返回資源對象的列表(數組)
GET /collection/resource:返回單個資源對象
POST /collection:返回新生成的資源對象
PUT /collection/resource:返回完整的資源對象
PATCH /collection/resource:返回完整的資源對象
DELETE /collection/resource:返回一個空文檔

十、Hypermedia API
RESTful API最好做到Hypermedia,即返回結果中提供鏈接,連向其他API方法(連接其他資源的url),使得用戶不查文檔,也知道下一步應該做什么
比如,當用戶向api.example.com的根目錄發出請求,會得到這樣一個文檔
{"link":
{
"rel": "collection https://www.example.com/zoos",
"href": "https://api.example.com/zoos",
"title": "List of zoos",
"type": "application/vnd.yourformat+json"
}
}
上面代碼表示,文檔中有一個link屬性,用戶讀取這個屬性就知道下一步該調用什么API了。
rel表示這個API與當前網址的關系(collection關系,并給出該collection的網址),
href表示API的路徑,title表示API的標題,type表示返回類型。

Hypermedia API的設計被稱為HATEOAS。Github的API就是這種設計,訪問api.github.com會得到一個所有可用API的網址列表
{
"current_user_url": "https://api.github.com/user",
"authorizations_url": "https://api.github.com/authorizations",
// ...
}

從上面可以看到,如果想獲取當前用戶的信息,應該去訪問api.github.com/user,然后就得到了下面結果
{
"message": "Requires authentication",
"documentation_url": "https://developer.github.com/v3"
}
面代碼表示,服務器給出了提示信息,以及文檔的網址

十一、其他
(1)API的身份認證應該使用OAuth 2.0框架。
(2)服務器返回的數據格式,應該盡量使用JSON,避免使用XML。

補充知識點:
使用Http頭聲明序列化格式
在客戶端和服務端,雙方都要知道通訊的格式,格式在HTTP-Header中指定
Content-Type 定義請求格式
Accept 定義系列可接受的響應格式

實際操作中的一些事項

前后端完全分離后,前端和后端如何交互?答:通過雙方協商好的API

定義json結構
JSON 結構
requestParams:

{
}
responseBody:

{
"meta": {
},
"data": {
}
}

meta 中封裝操作成功或失敗的消息,data 中封裝返回的具體數據
當新建商品或更新產品時,相關屬性封裝在 JSON 中,通過 POST 或 PUT 發送
{
"name": "Apple Watch SPORT",
"description": "Sport 系列的表殼材料為輕巧的銀色及深空灰色陽極氧化鋁金屬,強化 Ion-X 玻璃材質為顯示屏提供保護。
搭配高性能 Fluoroelastomer 表帶,共有 5 款繽紛色彩。"
}
當用戶對商品進行操作后,將得到響應結果。GET, POST, PUT 操作成功,返回如下結果
{
"meta": {
"code": 201,
"message": "創建成功"
},
"data": {
"id": "5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9",
"name": "Apple Watch SPORT",
"description": "Sport 系列的表殼材料為輕巧的銀色及深空灰色陽極氧化鋁金屬,強化 Ion-X 玻璃材質為顯示屏提供保護。
搭配高性能 Fluoroelastomer 表帶,共有 5 款繽紛色彩。"
}
}

DELETE 操作成功,返回如下結果
{
"meta": {
"code": 204,
"message": "刪除成功"
}
}

轉載于:https://www.cnblogs.com/potato-chip/p/9031808.html

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

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

相關文章

云計算基礎知識:CPU虛擬化

虛擬化技術的分類主要有服務器虛擬化、存儲虛擬化、網絡虛擬化、應用虛擬化。服務器虛擬化技術按照虛擬對象來分,可分為:CPU虛擬化、內存虛擬化、I/O虛擬化;按照虛擬化程度可分為:全虛擬化、半虛擬化、硬件輔助虛擬化。將不同的虛擬化對象和程…

WPF-18 INotifyPropertyChanged 接口

我們先來看看微軟官方給出的定語:通知客戶端屬性值已經更改。其實對于一個陌生小白來說,很難通過這句話來理解其中的原理,這個接口在WPF和Winform編程中經常會用到,下面是該接口的定義:namespace System.ComponentMode…

頭腦風暴 軟件_頭腦風暴和思維導圖的最佳網站和軟件

頭腦風暴 軟件A mind map is a diagram that allows you to visually outline information, helping you organize, solve problems, and make decisions. Start with a single idea in the center of the diagram and add associated ideas, words, and concepts connected ra…

NULL的陷阱:Merge

NULL表示unknown,不確定值,所以任何值(包括null值)和NULL值比較都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比較的結果都是false,這就是NULL…

Python實現將不規范的英文名字首字母大寫

Python實現將不規范的英文名字首字母大寫 這篇文章給大家主要介紹的是利用map()函數,把用戶輸入的不規范的英文名字,變為首字母大寫,其他小寫的規范名字。文中給出了三種解決方法,大家可以根據需要選擇使用,感興趣的朋…

使用 System.Text.Json 時,如何處理 Dictionary 中 Key 為自定義類型的問題

在使用 System.Text.Json 進行 JSON 序列化和反序列化操作時,我們會遇到一個問題:如何處理字典中的 Key 為自定義類型的問題。背景說明 例如,我們有如下代碼:// 定義一個自定義類型 public class CustomType {public int Id { get…

極限編程 (Extreme Programming) - 發布計劃 (Release Planning)

編寫用戶故事后,您可以使用發布計劃會議來創建發布計劃。發布計劃指定 將為每個系統版本實現哪些用戶故事以及這些版本的日期。這給出了一組用戶故事供客戶在迭代計劃會議期間進行選擇,以便在下一次迭代期間實施。然后將這些選定的故事翻譯成單獨的編程任…

使用Ubuntu的公用文件夾輕松地在計算機之間共享文件

You’ve probably noticed that Ubuntu comes with a Public folder in your home directory. This folder isn’t shared by default, but you can easily set up several different types of file-sharing to easily share files on your local network. 您可能已經注意到&am…

NSA泄露的惡意軟件DoublePulsar感染了數萬臺Windows電腦

本文講的是NSA泄露的惡意軟件DoublePulsar感染了數萬臺Windows電腦,安全研究人員認為,世界各地的腳本小子和在線犯罪分子正在利用Shadow Brokers 黑客組織上周泄露的NSA黑客工具,致使全球數十萬臺Windows計算機正面臨網絡攻擊威脅。 上周&…

Nginx、LVS及HAProxy負載均衡軟件的優缺點詳解

轉自:https://www.csdn.net/article/2014-07-24/2820837 摘要:Nginx/LVS/HAProxy是目前使用最廣泛的三種負載均衡軟件,一般對負載均衡的使用是隨著網站規模的提升根據不同的階段來使用不同的技術,具體的應用需求還得具體分析&…

windows下使用nginx調試簡介

安裝使用 nginx是一個反向代理服務器,在web開發調試中經常用到,寫一個簡單的使用說明和總結。 1. 下載 點擊官網下載地址 下載對應版本的nginx并解壓 2. 配置 在解壓的目錄下找到conf/nginx.conf文件添加所需監聽和代理的server # 項目名稱server {liste…

MASA Framework 命令查詢職責分離

概念CQRS (https://learn.microsoft.com/zh-cn/azure/architecture/patterns/cqrs)是一種與領域驅動設計和事件溯源相關的架構模式, 它的全稱是Command Query Responsibility Segregation, 又叫命令查詢職責分離, Greg Young在2010年創造了這個術語, 它是基于Bertrand Meyer 的…

Google的Project Stream準備在Chrome中播放AAA控制臺游戲

Streaming full 3D games over a high-speed web connection is a fast growing trend. And with ridiculous amounts of infrastructure and remote computing power, Google is well equipped to join it. 通過高速網絡連接流式傳輸完整的3D游戲是一種快速增長的趨勢。 憑借可…

私有云之迷思:未來是什么?

本文講的是私有云之迷思:未來是什么?,【編者的話】非常好的一篇文章,作者從OpenStack目前的困境講起,聊到了私有云的產生背景,進而介紹了云計算的發展史。從云計算誕生的初衷以及現在流行的分布式應用又延伸…

如何在vue中使用sass

安裝sass 安裝教程鏈接: https://www.sass.hk/install/ 在vue中使用sass 參考鏈接: https://www.jianshu.com/p/8e60048baeb7 打開控制臺:輸入命令行 如果是沒有淘寶鏡像的,先下載淘寶鏡像,之后的下載速度比較快 npm i…

maven項目的目錄結構

1、maven項目采用“約定優于配置”的原則: src/main/java:約定用于存放源代碼,src/test/java:用于存放單元測試代碼,(測試代碼的包應該和被測試代碼包結構保持一致,方便測試查找)src…

AWS大力支持.NET 開源項目,和Azure搶.NET 客戶

出品 | OSC開源社區(ID:oschina2013)在 2022 re:Invent 會議上, AWS 軟件開發經理 Saikat Banerjee 銳評道:” 我們發現 .NET 開源項目資金嚴重不足,仍可稱之為第三方開源”。隨即表示 AWS 過去非常重視 .net 生態&…

攻防 logmein_如何使用LogMeIn Hamachi在任何地方訪問文件

攻防 logmeinWhether you’re at work and forgot some file on your home computer, want to play some music on a train, or just want to move some files between your computers, accessing your files from anywhere is a life saver. 無論您是在工作時忘記了家用計算機…

Docker-machine創建虛機時停在虛機啟動的提示上,并且創建的虛機顯示Ip Not found...

Docker-machine創建虛機時停在虛機啟動的提示上,并且創建的虛機用docker-machine ls 列出來的時候顯示Ip Not found, 是什么原因那? 【答案】 看這個帖子: https://github.com/docker/machine/issues/3832 拷貝如下: I…

【年度總結】2016年年度總結

早晨醒來,在被窩里面刷著簡書,看到一篇文章叫《深漂一年,一個資深程序員的2016年終告白》,寫的很好,很有感觸。在2016年的農歷的最后一天,總是有很多感觸要寫下來。所以下午掃墓之后,我也按照劇…