国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第九篇 API設(shè)計原則與最佳實踐

這篇具有很好參考價值的文章主要介紹了第九篇 API設(shè)計原則與最佳實踐。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

深入淺出HTTP請求前后端交互系列專題
第一章 引言-HTTP協(xié)議基礎(chǔ)概念和前后端分離架構(gòu)請求交互概述
第二章 HTTP請求方法、狀態(tài)碼詳解與緩存機(jī)制解析
第三章 前端發(fā)起HTTP請求
第四章 前后端數(shù)據(jù)交換格式詳解
第五章 跨域資源共享(CORS):現(xiàn)代Web開發(fā)中的關(guān)鍵機(jī)制
第六篇 提升網(wǎng)頁性能:深入解析HTTP請求優(yōu)化策略(一)
第七篇 提升網(wǎng)頁性能:深入解析HTTP請求優(yōu)化策略(二)
第八篇 提升網(wǎng)頁性能:深入解析HTTP請求優(yōu)化策略(三)
第九篇 API設(shè)計原則與最佳實踐
第十篇 Axios最佳實戰(zhàn):前端HTTP通信的王者之選
第十一篇 前沿趨勢與展望:深入探索GraphQL、RESTful API、WebSocket、SSE及QUIC與HTTP/3

API設(shè)計原則與最佳實踐

RESTful API設(shè)計原則

1. 資源導(dǎo)向

a. 資源識別

在REST架構(gòu)風(fēng)格中,API的設(shè)計圍繞資源展開。每個URL代表一個可被唯一標(biāo)識的資源,并且應(yīng)當(dāng)清晰、簡潔和語義化。例如:

/api/users       # 用戶集合資源
/api/users/42    # 特定ID為42的用戶資源
b. HTTP動詞的使用

通過HTTP方法來定義對資源的操作:

  • GET:用于獲取資源信息。
  • POST:用于創(chuàng)建新資源。
  • PUT:用于替換整個資源。
  • PATCH:用于更新資源的部分內(nèi)容。
  • DELETE:用于刪除資源。

2. 狀態(tài)轉(zhuǎn)移

API應(yīng)遵循無狀態(tài)通信原則,每次請求都應(yīng)包含所有必要的信息以完成操作,服務(wù)器不保存客戶端會話狀態(tài)。

3. 統(tǒng)一接口

確保API的一致性,不同資源類型的處理方式應(yīng)當(dāng)遵從相同的模式。

為了更直觀地體現(xiàn)RESTful API的優(yōu)勢,我們將通過使用axios庫(一個流行的JavaScript HTTP客戶端)來調(diào)用RESTful API和非RESTful API的示例進(jìn)行對比。

4. RESTful API 示例(axios調(diào)用)

// 引入axios庫
import axios from 'axios';

// 創(chuàng)建RESTful API實例
const api = axios.create({
  baseURL: 'https://api.example.com/v1',
});

// 調(diào)用RESTful API資源
async function createNewOrder(orderData) {
  try {
    // POST請求創(chuàng)建新訂單
    const response = await api.post('/orders', orderData);
    return response.data;
  } catch (error) {
    console.error('Error creating order:', error.response.data);
  }
}

async function updateOrderStatus(orderId, newStatus) {
  try {
    // PUT請求更新訂單狀態(tài)
    const url = `/orders/${orderId}`;
    const data = { status: newStatus };
    const response = await api.put(url, data);
    return response.data;
  } catch (error) {
    console.error('Error updating order status:', error.response.data);
  }
}

async function deleteOrder(orderId) {
  try {
    // DELETE請求刪除訂單
    const url = `/orders/${orderId}`;
    await api.delete(url);
  } catch (error) {
    console.error('Error deleting order:', error.response.data);
  }
}

// 使用示例
const newOrder = { /* 訂單數(shù)據(jù) */ };
createNewOrder(newOrder).then(createdOrder => console.log('Created order:', createdOrder));

const orderIdToUpdate = '123';
const updatedStatus = 'shipped';
updateOrderStatus(orderIdToUpdate, updatedStatus).then(updatedOrder => console.log('Updated order:', updatedOrder));

const orderIdToDelete = '456';
deleteOrder(orderIdToDelete).then(() => console.log('Deleted order with ID:', orderIdToDelete));

5. 非RESTful API 示例(axios調(diào)用)

// 同樣引入axios庫
import axios from 'axios';

// 非RESTful API的調(diào)用方式
const nonRestApi = axios.create({
  baseURL: 'https://legacy.example.com/api',
});

async function executeNonRestAction(action, data) {
  try {
    // 動作類型作為URL的一部分
    const url = `/${action}`;
    const response = await nonRestApi.post(url, data);
    return response.data;
  } catch (error) {
    console.error(`Error executing action ${action}:`, error.response.data);
  }
}

async function createLegacyOrder(orderData) {
  try {
    const response = await executeNonRestAction('CreateNewOrder', orderData);
    return response;
  } catch (error) {
    console.error('Error creating legacy order:', error.response.data);
  }
}

async function updateLegacyOrderStatus(orderId, newStatus) {
  try {
    const requestData = { orderId, status: newStatus };
    const response = await executeNonRestAction('UpdateOrderStatus', requestData);
    return response;
  } catch (error) {
    console.error('Error updating legacy order status:', error.response.data);
  }
}

// 使用示例
const legacyOrder = { /* 訂單數(shù)據(jù) */ };
createLegacyOrder(legacyOrder).then(createdOrder => console.log('Created legacy order:', createdOrder));

const legacyOrderId = '789';
const legacyUpdatedStatus = 'processing';
updateLegacyOrderStatus(legacyOrderId, legacyUpdatedStatus).then(updatedOrder => console.log('Updated legacy order:', updatedOrder));

優(yōu)勢對比:

  • 清晰性與一致性:RESTful API中每個HTTP方法都對應(yīng)著特定的操作意圖,使得API的設(shè)計更加直觀且易于理解。例如,在RESTful API中,POST /orders明確表示創(chuàng)建新訂單,而PUT /orders/:id則用于更新訂單,結(jié)構(gòu)一致,無需額外記憶特殊動作名。

  • 可擴(kuò)展性與維護(hù)性:隨著系統(tǒng)的發(fā)展,RESTful API可以輕松添加新的資源或資源操作,因為它們遵循統(tǒng)一的模式。而非RESTful API在新增功能時可能需要不斷調(diào)整URL路徑和動作命名規(guī)則。

  • 工具支持與緩存機(jī)制:許多開發(fā)工具和網(wǎng)絡(luò)基礎(chǔ)設(shè)施針對RESTful API設(shè)計提供了更好的支持,如自動補(bǔ)全、接口文檔生成器等。此外,RESTful API更容易利用HTTP協(xié)議的緩存特性,如響應(yīng)頭中的Cache-Control、ETag等字段,提升性能。

  • 版本控制與兼容性:RESTful API可以通過URI路徑或Accept頭等方式實現(xiàn)版本控制,從而方便地處理升級過程中的兼容問題。非RESTful API在沒有明確版本管理的情況下可能會帶來更復(fù)雜的升級挑戰(zhàn)。

通過上述對比,可以看出RESTful API在設(shè)計原則、開發(fā)者體驗、長期維護(hù)以及與現(xiàn)有Web標(biāo)準(zhǔn)的契合度等方面具有顯著優(yōu)勢。

HATEOAS理念與實踐

1. Hypermedia as the Engine of Application State (HATEOAS)

a. 原則闡述

HATEOAS是REST的核心特性之一,它意味著API響應(yīng)中應(yīng)該包含足夠的鏈接信息,使得客戶端可以通過這些鏈接發(fā)現(xiàn)接下來可以執(zhí)行的動作,而無需預(yù)知具體URL。

例如,在一個電商應(yīng)用中,當(dāng)客戶端請求一個訂單資源時,服務(wù)器返回的JSON響應(yīng)不僅包含訂單詳情,還會包括鏈接到相關(guān)操作的URL,如:

{
  "id": "12345",
  "customer": "John Doe",
  "status": "pending",
  "total": "$100.00",
  "_links": {
    "self": { "href": "/orders/12345" },
    "cancel": { "href": "/orders/12345/cancel", "method": "POST" },
    "pay": { "href": "/orders/12345/pay", "method": "POST" },
    "items": { "href": "/orders/12345/items" }
  }
}

在這個例子中,_links屬性定義了幾個鏈接:

  • self:指向當(dāng)前訂單資源自身的URL。
  • cancelpay:分別指示了取消訂單和支付訂單的操作,通過POST方法觸發(fā)這些動作,并給出了對應(yīng)的動作URL。
  • items:指向與當(dāng)前訂單相關(guān)的商品列表資源。

這樣的設(shè)計允許客戶端根據(jù)接收到的數(shù)據(jù)結(jié)構(gòu)動態(tài)發(fā)現(xiàn)并導(dǎo)航到不同的資源和狀態(tài),無需硬編碼URL或者了解整個API的結(jié)構(gòu)。這使得API更加靈活、可擴(kuò)展且易于維護(hù),同時增強(qiáng)了客戶端的適應(yīng)性,因為它們可以根據(jù)服務(wù)器提供的上下文信息來決定下一步的操作。

b. 實踐舉例
{
  "user": {
    "id": 42,
    "name": "Alice",
    "_links": {
      "self": { "href": "/api/users/42" },
      "edit": { "href": "/api/users/42/edit" },
      "orders": { "href": "/api/users/42/orders" }
    }
  }
}

在這個示例中,API返回的數(shù)據(jù)包含了指向當(dāng)前用戶資源、編輯資源以及該用戶訂單集合的鏈接,允許客戶端通過解析這些鏈接來進(jìn)行導(dǎo)航和交互。

在遵循HATEOAS原則的RESTful API設(shè)計中,_links或類似結(jié)構(gòu)中的鍵(keys)并不是隨意生成的,而是根據(jù)資源間關(guān)系和操作意圖來命名的。例如,“self”、“next”、“prev”、“create”、"update"等都是常見的鏈接關(guān)系名稱,它們具有一定的語義意義,客戶端可以根據(jù)這些名稱理解鏈接的目的。

對于前端來說,確實需要處理這一層額外的信息,但這樣做的好處在于:

  1. 動態(tài)發(fā)現(xiàn):客戶端無需預(yù)先知道所有可能的接口地址或者API的變化,只需要解析返回的鏈接信息就能找到下一步操作的入口。

  2. 可擴(kuò)展性:當(dāng)API進(jìn)行版本升級或添加新的功能時,只要保持鏈接關(guān)系的約定不變,前端應(yīng)用可以繼續(xù)正常工作,無需硬編碼新的URL。

  3. 松耦合:前后端之間的耦合度降低,后端服務(wù)架構(gòu)可以獨立演化而不影響前端用戶體驗。

至于是否需要存儲這個信息以便以后使用,這取決于具體的業(yè)務(wù)需求。有些情況下,客戶端可能需要臨時緩存部分鏈接以實現(xiàn)頁面間的跳轉(zhuǎn)或者異步操作;而在其他場景下,客戶端可能會立即利用這些鏈接執(zhí)行后續(xù)請求,并不需要持久化存儲。通常,在構(gòu)建響應(yīng)式前端應(yīng)用時,會根據(jù)當(dāng)前狀態(tài)和用戶交互實時處理接收到的鏈接信息,而不是靜態(tài)地存儲全部鏈接數(shù)據(jù)。

API版本控制策略

1. 版本管理方法

i. URL路徑版本化

將版本號嵌入到URL路徑中,如:

/v1/users
/v2/users
ii. 請求頭版本化

通過HTTP請求頭傳遞版本信息,例如:

Accept: application/vnd.example-com.user+json;version=1.0
iii. 查詢參數(shù)版本化

也可以選擇將版本號作為查詢參數(shù)傳遞:

/api/users?version=1

錯誤處理與反饋設(shè)計

1. 錯誤處理機(jī)制

a. HTTP狀態(tài)碼

正確使用HTTP狀態(tài)碼傳達(dá)請求結(jié)果的狀態(tài),如4xx系列表示客戶端錯誤,5xx系列表示服務(wù)器端錯誤。

b. 錯誤響應(yīng)格式

提供統(tǒng)一且詳細(xì)的錯誤消息體,通常是一個JSON對象,包括錯誤代碼、描述信息、可能的話還包含解決問題的建議或指向幫助文檔的鏈接。

{
  "error": "BadRequest",
  "message": "Missing required parameter 'username'",
  "status_code": 400,
  "more_info": "https://docs.example.com/errors/400"
}

通過遵循以上設(shè)計原則與最佳實踐,開發(fā)者能夠構(gòu)建出易于理解和使用的RESTful API,并確保其在版本迭代和異常處理時具備良好的擴(kuò)展性和可靠性。文章來源地址http://www.zghlxwxcb.cn/news/detail-819271.html

到了這里,關(guān)于第九篇 API設(shè)計原則與最佳實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 構(gòu)建穩(wěn)健的微服務(wù)架構(gòu):關(guān)鍵的微服務(wù)設(shè)計原則和最佳實踐

    ????????在現(xiàn)代軟件開發(fā)中,微服務(wù)架構(gòu)正逐漸成為構(gòu)建復(fù)雜應(yīng)用程序的首選方法之一。微服務(wù)架構(gòu)的核心理念是將應(yīng)用程序劃分為一系列小型、自治的服務(wù),每個服務(wù)專注于一個特定的業(yè)務(wù)功能。然而,要實現(xiàn)一個穩(wěn)健的微服務(wù)架構(gòu)并不僅僅是將功能拆分成微服務(wù),還需

    2024年02月14日
    瀏覽(89)
  • 【最佳實踐】如何設(shè)計 RESTful API ?

    良好的 API 設(shè)計是一個經(jīng)常被提及的話題,特別是對于那些試圖完善其 API 策略的團(tuán)隊來說。一個設(shè)計良好的 API 的好處包括:改進(jìn)開發(fā)者體驗、更快速地編寫文檔以及更高效地推廣你的 API。但是,到底什么才構(gòu)成了良好 API 設(shè)計呢?在這篇博客文章中,我將詳細(xì)介紹幾個為

    2024年02月07日
    瀏覽(24)
  • 【Git 入門教程】第九節(jié)、Git的最佳實踐

    【Git 入門教程】第九節(jié)、Git的最佳實踐

    Git是一個強(qiáng)大的版本控制系統(tǒng),可以幫助開發(fā)者管理和協(xié)調(diào)代碼庫。然而,正確使用Git并不總是容易。本文將介紹一些Git的最佳實踐,以幫助開發(fā)者更好地利用Git來管理和協(xié)調(diào)代碼庫。 ? 在使用Git時,編寫有意義的提交信息是非常重要的。提交信息應(yīng)該簡明扼要地描述所做的

    2024年02月06日
    瀏覽(16)
  • 第九篇【傳奇開心果系列】Ant Design Mobile of React 開發(fā)移動應(yīng)用:使用內(nèi)置組件實現(xiàn)響應(yīng)式設(shè)計

    第九篇【傳奇開心果系列】Ant Design Mobile of React 開發(fā)移動應(yīng)用:使用內(nèi)置組件實現(xiàn)響應(yīng)式設(shè)計

    第一篇【傳奇開心果系列】Ant Design Mobile of React 開發(fā)移動應(yīng)用:從helloworld開始 第二篇【傳奇開心果系列】Ant Design Mobile of React 開發(fā)移動應(yīng)用:天氣應(yīng)用 第三篇【傳奇開心果系列】Ant Design Mobile of React 開發(fā)移動應(yīng)用:健身追蹤 第四篇【傳奇開心果系列】Ant Design Mobile of React 開發(fā)移

    2024年01月21日
    瀏覽(89)
  • 深入淺出:Zookeeper的原理與實踐

    在當(dāng)今的信息時代,分布式系統(tǒng)的應(yīng)用越來越廣泛,而其中一個至關(guān)重要的組成部分就是Zookeeper。作為一個分布式協(xié)調(diào)服務(wù),Zookeeper在保障分布式系統(tǒng)的一致性、可靠性和可用性方面發(fā)揮著不可替代的作用。本博客旨在深入淺出地探討Zookeeper的原理與實踐,幫助讀者全面理解

    2024年04月11日
    瀏覽(27)
  • 深入淺出 OkHttp 源碼解析及應(yīng)用實踐

    作者:vivo 互聯(lián)網(wǎng)服務(wù)器團(tuán)隊- Tie Qinrui OkHttp 在 Java 和 Android 世界中被廣泛使用,深入學(xué)習(xí)源代碼有助于掌握軟件特性和提高編程水平。 本文首先從源代碼入手簡要分析了一個請求發(fā)起過程中的核心代碼,接著通過流程圖和架構(gòu)圖概括地介紹了OkHttp的整體結(jié)構(gòu),重點分析了攔

    2024年02月05日
    瀏覽(37)
  • 《移動互聯(lián)網(wǎng)技術(shù)》第九章 感知與多媒體: 了解質(zhì)感設(shè)計的基本原則和設(shè)計方法

    《移動互聯(lián)網(wǎng)技術(shù)》第九章 感知與多媒體: 了解質(zhì)感設(shè)計的基本原則和設(shè)計方法

    ???? 博主 libin9iOak帶您 Go to New World.??? ?? 個人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動形象??簡單易學(xué)!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學(xué)會IDEA常用操作,工作效率翻倍~?? ???? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬

    2024年02月11日
    瀏覽(26)
  • java基礎(chǔ)-----第九篇

    java基礎(chǔ)-----第九篇

    引用計數(shù)法:每個對象有一個引用計數(shù)屬性,新增一個引用時計數(shù)加1,引用釋放時計數(shù)減1,計 數(shù)為0時可以回收, 可達(dá)性分析法:從 GC Roots 開始向下搜索,搜索所走過的路徑稱為引用鏈。當(dāng)一個對象到 GC Roots 沒有任何引用鏈相連時,則證明此對象是不可用的,那么虛擬機(jī)就

    2024年02月10日
    瀏覽(24)
  • MySQL篇---第九篇

    READ UNCOMMITTED(未提交讀):事務(wù)中的修改,即使沒有提交,對其他事務(wù)也都是可見 的。會導(dǎo)致臟讀。 READ COMMITTED(提交讀):事務(wù)從開始直到提交之前,所做的任何修改對其他事務(wù)都是 不可見的。會導(dǎo)致不可重復(fù)讀。這個隔離級別,也可以叫做“不可重復(fù)讀”。 REPEATABLE

    2024年02月07日
    瀏覽(23)
  • 【第九篇:接口自動化建設(shè)】

    不要問我為什這么晚發(fā)布,這可能是我有史以來加班最晚的時候了,啊啊啊 我們之前也說過進(jìn)行接口自動化建設(shè)主要是為了自動化測試服務(wù)端的邏輯,客戶端與后端交互使用的主要協(xié)議的就是http協(xié)議,這也是為什么我在開篇就和大家強(qiáng)調(diào)過相關(guān)的基本功的學(xué)習(xí),學(xué)習(xí)這些基

    2024年02月03日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包