成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

花5分鐘看這篇之前,你才發(fā)現(xiàn)你不懂RESTful

開發(fā) 前端
在互聯(lián)網(wǎng)并沒有完全流行的初期,移動端也沒有那么盛行,頁面請求和并發(fā)量也不高,那時候人們對接口的要求沒那么高,一些動態(tài)頁面(jsp)就能滿足絕大多數(shù)的使用需求。

 前言

在學(xué)習(xí)RESTful 風(fēng)格接口之前,即使你不知道它是什么,但你肯定會好奇它能解決什么問題?有什么應(yīng)用場景?聽完下面描述我想你就會明白:

在互聯(lián)網(wǎng)并沒有完全流行的初期,移動端也沒有那么盛行,頁面請求和并發(fā)量也不高,那時候人們對接口的要求沒那么高,一些動態(tài)頁面(jsp)就能滿足絕大多數(shù)的使用需求。


但是隨著互聯(lián)網(wǎng)和移動設(shè)備的發(fā)展,人們對Web應(yīng)用的使用需求也增加,傳統(tǒng)的動態(tài)頁面由于低效率而漸漸被HTML+JavaScript(Ajax)的前后端分離所取代,并且安卓、IOS、小程序等形式客戶端層出不窮,客戶端的種類出現(xiàn)多元化,而客戶端和服務(wù)端就需要接口進行通信,但接口的規(guī)范性就又成了一個問題:


所以一套結(jié)構(gòu)清晰、符合標(biāo)準(zhǔn)、易于理解、擴展方便讓大部分人都能夠理解接受的接口風(fēng)格就顯得越來越重要,而RESTful風(fēng)格的接口(RESTful API)剛好有以上特點,就逐漸被實踐應(yīng)用而變得流行起來。


現(xiàn)在,RESTful是目前最流行的接口設(shè)計規(guī)范,在很多公司有著廣泛的應(yīng)用,其中Github 的API設(shè)計就是很標(biāo)準(zhǔn)的RESTful API,你可以參考學(xué)習(xí)。

在開發(fā)實踐中我們很多人可能還是使用傳統(tǒng)API進行請求交互,很多人其實并不特別了解RESTful API,對RESTful API的認(rèn)知可能會停留在:

  • 面向資源類型的
  • 是一種風(fēng)格
  • (誤區(qū))接口傳遞參數(shù)使用斜杠(/)分割而不用問號(?)傳參。

而其實一個很大的誤區(qū)不要認(rèn)為沒有查詢字符串就是RESTful API,也不要認(rèn)為用了查詢字符串就不是RESTful API,更不要認(rèn)為用了JSON傳輸?shù)腁PI就是RESTful API。

本篇將帶你了解RESTful并用SpringBoot實戰(zhàn)RESTful API.

一、REST介紹

REST涉及一些概念性的東西可能比較多,在實戰(zhàn)RESTful API之前,要對REST相關(guān)的知識有個系統(tǒng)的認(rèn)知。

REST的誕生

REST(英文:Representational State Transfer,簡稱REST,直譯過來表現(xiàn)層狀態(tài)轉(zhuǎn)換)是一種軟件架構(gòu)風(fēng)格、設(shè)計風(fēng)格,而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計原則和約束條件。它主要用于客戶端和服務(wù)器交互類的軟件。基于這個風(fēng)格設(shè)計的軟件可以更簡潔,更有層次,更易于實現(xiàn)緩存等機制。

它首次出現(xiàn)在 2000 年 Roy Thomas Fielding 的博士論文中,這篇論文定義并詳細(xì)介紹了表述性狀態(tài)轉(zhuǎn)移(Representational State Transfer,REST)的架構(gòu)風(fēng)格,并且描述了 如何使用 REST 來指導(dǎo)現(xiàn)代 Web 架構(gòu)的設(shè)計和開發(fā)。用他自己的原話說:

  • 我寫這篇文章的目的是:在符合架構(gòu)原理前提下,理解和評估基于網(wǎng)絡(luò)的應(yīng)用軟件的架構(gòu)設(shè)計,得到一個功能強、性能好、適宜通信的架構(gòu)。

需要注意的是REST并沒有一個明確的標(biāo)準(zhǔn),而更像是一種設(shè)計的風(fēng)格,滿足這種設(shè)計風(fēng)格的程序或接口我們稱之為RESTful(從單詞字面來看就是一個形容詞)。所以RESTful API 就是滿足REST架構(gòu)風(fēng)格的接口。

Fielding博士答辯

Fielding博士當(dāng)時提出的是REST架構(gòu)在很久的時間內(nèi)并沒有被關(guān)注太多,而近些年REST在國內(nèi)才變得越來越流行。下面開始詳細(xì)學(xué)習(xí)REST架構(gòu)特征。

REST架構(gòu)特征

既然知道REST和RESTful的聯(lián)系和區(qū)別,現(xiàn)在就要開始好好了解RESTful的一些約束條件和規(guī)則,RESTful是一種風(fēng)格而不是標(biāo)準(zhǔn),而這個風(fēng)格大致有以下幾個主要特征:

以資源為基礎(chǔ) :資源可以是一個圖片、音樂、一個XML格式、HTML格式或者JSON格式等網(wǎng)絡(luò)上的一個實體,除了一些二進制的資源外普通的文本資源更多以JSON為載體、面向用戶的一組數(shù)據(jù)(通常從數(shù)據(jù)庫中查詢而得到)。

統(tǒng)一接口: 對資源的操作包括獲取、創(chuàng)建、修改和刪除,這些操作正好對應(yīng)HTTP協(xié)議提供的GET、POST、PUT和DELETE方法。換言而知,使用RESTful風(fēng)格的接口但從接口上你可能只能定位其資源,但是無法知曉它具體進行了什么操作,需要具體了解其發(fā)生了什么操作動作要從其HTTP請求方法類型上進行判斷。具體的HTTP方法和方法含義如下:

  • GET(SELECT):從服務(wù)器取出資源(一項或多項)。
  • POST(CREATE):在服務(wù)器新建一個資源。
  • PUT(UPDATE):在服務(wù)器更新資源(客戶端提供完整資源數(shù)據(jù))。
  • PATCH(UPDATE):在服務(wù)器更新資源(客戶端提供需要修改的資源數(shù)據(jù))。
  • DELETE(DELETE):從服務(wù)器刪除資源。

當(dāng)然也有很多在具體使用的時候使用PUT表示更新。從請求的流程來看,RESTful API和傳統(tǒng)API大致架構(gòu)如下:


URI指向資源:URI = Universal Resource Identifier 統(tǒng)一資源標(biāo)志符,用來標(biāo)識抽象或物理資源的一個緊湊字符串。URI包括URL和URN,在這里更多時候可能代指URL(統(tǒng)一資源定位符)。RESTful是面向資源的,每種資源可能由一個或多個URI對應(yīng),但一個URI只指向一種資源。

無狀態(tài):服務(wù)器不能保存客戶端的信息, 每一次從客戶端發(fā)送的請求中,要包含所有必須的狀態(tài)信息,會話信息由客戶端保存, 服務(wù)器端根據(jù)這些狀態(tài)信息來處理請求。當(dāng)客戶端可以切換到一個新狀態(tài)的時候發(fā)送請求信息, 當(dāng)一個或者多個請求被發(fā)送之后, 客戶端就處于一個狀態(tài)變遷過程中。每一個應(yīng)用的狀態(tài)描述可以被客戶端用來初始化下一次的狀態(tài)變遷。

REST架構(gòu)限制條件

Fielding在論文中提出REST架構(gòu)的6個限制條件,也可稱為RESTful 6大原則, 標(biāo)準(zhǔn)的REST約束應(yīng)滿足以下6個原則:

客戶端-服務(wù)端(Client-Server): 這個更專注客戶端和服務(wù)端的分離,服務(wù)端獨立可更好服務(wù)于前端、安卓、IOS等客戶端設(shè)備。

無狀態(tài)(Stateless):服務(wù)端不保存客戶端狀態(tài),客戶端保存狀態(tài)信息每次請求攜帶狀態(tài)信息。

可緩存性(Cacheability) :服務(wù)端需回復(fù)是否可以緩存以讓客戶端甄別是否緩存提高效率。

統(tǒng)一接口(Uniform Interface):通過一定原則設(shè)計接口降低耦合,簡化系統(tǒng)架構(gòu),這是RESTful設(shè)計的基本出發(fā)點。當(dāng)然這個內(nèi)容除了上述特點提到部分具體內(nèi)容比較多詳細(xì)了解可以參考這篇REST論文內(nèi)容。

分層系統(tǒng)(Layered System):客戶端無法直接知道連接的到終端還是中間設(shè)備,分層允許你靈活的部署服務(wù)端項目。

按需代碼(Code-On-Demand,可選):按需代碼允許我們靈活的發(fā)送一些看似特殊的代碼給客戶端例如JavaScript代碼。

REST架構(gòu)的一些風(fēng)格和限制條件就先介紹到這里,后面就對RESTful風(fēng)格API具體介紹。

二、RESTful API設(shè)計規(guī)范

既然了解了RESTful的一些規(guī)則和特性,那么具體該怎么去設(shè)計一個RESTful API呢?要從URL路徑、HTTP請求動詞、狀態(tài)碼和返回結(jié)果等方面詳細(xì)考慮。至于其他的方面例如錯誤處理、過濾信息等規(guī)范這里就不詳細(xì)介紹了。

URL設(shè)計規(guī)范

URL為統(tǒng)一資源定位器 ,接口屬于服務(wù)端資源,首先要通過URL這個定位到資源才能去訪問,而通常一個完整的URL組成由以下幾個部分構(gòu)成:

  1. URI = scheme "://" host  ":"  port "/" path [ "?" query ][ "#" fragment ] 

scheme: 指底層用的協(xié)議,如http、https、ftp

host: 服務(wù)器的IP地址或者域名

port: 端口,http默認(rèn)為80端口

path: 訪問資源的路徑,就是各種web 框架中定義的route路由

query: 查詢字符串,為發(fā)送給服務(wù)器的參數(shù),在這里更多發(fā)送數(shù)據(jù)分頁、排序等參數(shù)。

fragment: 錨點,定位到頁面的資源

我們在設(shè)計API時URL的path是需要認(rèn)真考慮的,而RESTful對path的設(shè)計做了一些規(guī)范,通常一個RESTful API的path組成如下:

  1. /{version}/{resources}/{resource_id} 

version:API版本號,有些版本號放置在頭信息中也可以,通過控制版本號有利于應(yīng)用迭代。

resources:資源,RESTful API推薦用小寫英文單詞的復(fù)數(shù)形式。

resource_id:資源的id,訪問或操作該資源。

當(dāng)然,有時候可能資源級別較大,其下還可細(xì)分很多子資源也可以靈活設(shè)計URL的path,例如:

  1. /{version}/{resources}/{resource_id}/{subresources}/{subresource_id} 

此外,有時可能增刪改查無法滿足業(yè)務(wù)要求,可以在URL末尾加上action,例如

  1. /{version}/{resources}/{resource_id}/action 

其中action就是對資源的操作。

從大體樣式了解URL路徑組成之后,對于RESTful API的URL具體設(shè)計的規(guī)范如下:

  1. 不用大寫字母,所有單詞使用英文且小寫。
  2. 連字符用中杠"-"而不用下杠"_"
  3. 正確使用 "/"表示層級關(guān)系,URL的層級不要過深,并且越靠前的層級應(yīng)該相對越穩(wěn)定
  4. 結(jié)尾不要包含正斜杠分隔符"/"
  5. URL中不出現(xiàn)動詞,用請求方式表示動作
  6. 資源表示用復(fù)數(shù)不要用單數(shù)
  7. 不要使用文件擴展名

HTTP動詞

在RESTful API中,不同的HTTP請求方法有各自的含義,這里就展示GET,POST,PUT,DELETE幾種請求API的設(shè)計與含義分析。針對不同操作,具體的含義如下:

  1. GET /collection:從服務(wù)器查詢資源的列表(數(shù)組) 
  2. GET /collection/resource:從服務(wù)器查詢單個資源 
  3. POST /collection:在服務(wù)器創(chuàng)建新的資源 
  4. PUT /collection/resource:更新服務(wù)器資源 
  5. DELETE /collection/resource:從服務(wù)器刪除資源 

在非RESTful風(fēng)格的API中,我們通常使用GET請求和POST請求完成增刪改查以及其他操作,查詢和刪除一般使用GET方式請求,更新和插入一般使用POST請求。從請求方式上無法知道API具體是干嘛的,所有在URL上都會有操作的動詞來表示API進行的動作,例如:query,add,update,delete等等。

而RESTful風(fēng)格的API則要求在URL上都以名詞的方式出現(xiàn),從幾種請求方式上就可以看出想要進行的操作,這點與非RESTful風(fēng)格的API形成鮮明對比。

在談及GET,POST,PUT,DELETE的時候,就必須提一下接口的安全性和冪等性,其中安全性是指方法不會修改資源狀態(tài),即讀的為安全的,寫的操作為非安全的。而冪等性的意思是操作一次和操作多次的最終效果相同,客戶端重復(fù)調(diào)用也只返回同一個結(jié)果。

上述四個HTTP請求方法的安全性和冪等性如下:

狀態(tài)碼和返回數(shù)據(jù)

服務(wù)端處理完成后客戶端也可能不知道具體成功了還是失敗了,服務(wù)器響應(yīng)時,包含狀態(tài)碼和返回數(shù)據(jù)兩個部分。

狀態(tài)碼

我們首先要正確使用各類狀態(tài)碼來表示該請求的處理執(zhí)行結(jié)果。狀態(tài)碼主要分為五大類:

  1. 1xx:相關(guān)信息 
  2. 2xx:操作成功 
  3. 3xx:重定向 
  4. 4xx:客戶端錯誤 
  5. 5xx:服務(wù)器錯誤 

 每一大類有若干小類,狀態(tài)碼的種類比較多,而主要常用狀態(tài)碼羅列在下面:

200 OK - [GET]:服務(wù)器成功返回用戶請求的數(shù)據(jù),該操作是冪等的(Idempotent)。

201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功。

202 Accepted - [*]:表示一個請求已經(jīng)進入后臺排隊(異步任務(wù))

204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功。

400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請求有錯誤,服務(wù)器沒有進行新建或修改數(shù)據(jù)的操作,該操作是冪等的。

401 Unauthorized - [*]:表示用戶沒有權(quán)限(令牌、用戶名、密碼錯誤)。

403 Forbidden - [*] 表示用戶得到授權(quán)(與401錯誤相對),但是訪問是被禁止的。

404 NOT FOUND - [*]:用戶發(fā)出的請求針對的是不存在的記錄,服務(wù)器沒有進行操作,該操作是冪等的。

406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。

410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。

422 Unprocesable entity - [POST/PUT/PATCH] 當(dāng)創(chuàng)建一個對象時,發(fā)生一個驗證錯誤。

500 INTERNAL SERVER ERROR - [*]:服務(wù)器發(fā)生錯誤,用戶將無法判斷發(fā)出的請求是否成功。

返回結(jié)果

針對不同操作,服務(wù)器向用戶返回數(shù)據(jù),而各個團隊或公司封裝的返回實體類也不同,但都返回JSON格式數(shù)據(jù)給客戶端。

第三關(guān) 一個RESTful API案例

上面講了RESTful理論知識,下面動手實現(xiàn)一個小案例吧!

預(yù)備

在本案例的實戰(zhàn)中,我們訪問的RESTful接口都是對數(shù)據(jù)庫真實的操作,新建數(shù)據(jù)庫,創(chuàng)建一個數(shù)據(jù)庫和表(根據(jù)自己喜好)。

選擇Maven依賴的時候,只需要勾選其中Spring的Web模塊、MySQL驅(qū)動以及MyBatis框架。

本案例的POJO創(chuàng)建Dog.java實體對象,其具體構(gòu)造為:

  1. package com.restfuldemo.pojo; 
  2.  
  3. public class Dog { 
  4.     private int id;//唯一id標(biāo)識 
  5.     private String name;//名稱 
  6.     private  int age;//年齡 
  7.     //省略get set 

上面創(chuàng)建好了項目,我們就開始構(gòu)建RESTful風(fēng)格的API。在具體構(gòu)建RESTful API的時候,需要對各種請求有更細(xì)致的認(rèn)知,當(dāng)然,本案例在實現(xiàn)各種請求的時候為了演示的便捷并沒有完全遵循RESTful API規(guī)范,例如版本號等信息這里就不添加了,案例更側(cè)重于使用SpringBoot實現(xiàn)這個接口。

本案例實現(xiàn)對dog資源的增刪改查,如下是非RESTful 和RESTful接口對比:

另外在使用postman進行發(fā)送請求的時候,有三種常用的文件類型傳遞到后端:


form-data :就是form表單中的multipart/form-data,會將表單數(shù)據(jù)處理為一條信息,用特定標(biāo)簽符將一條條信息分割開,而這個文件類型通常用來上傳二進制文件。

x-www-form-urlencoded:就是application/x-www-form-urlencoded,是form表單默認(rèn)的encType,form表單會將表單內(nèi)的數(shù)據(jù)轉(zhuǎn)換為鍵值對,這種格式不能上傳文件。

raw:可以上傳任意格式的文本,可以上傳Text,JSON,XML等,但目前大部分還是上傳JSON格式數(shù)據(jù)。當(dāng)后端需要接收J(rèn)SON格式數(shù)據(jù)處理的時候,可以采用這種格式來測試。

因為GET請求查詢參數(shù)在URL上,其他類型請求使用x-www-form-urlencoded方式向后端傳值。

GET POST PUT DELETE請求

GET請求用來獲取資源:GET請求會向數(shù)據(jù)庫發(fā)索取數(shù)據(jù)的請求,從而來獲取資源,該請求就像數(shù)據(jù)庫的select操作一樣,只是用來查詢數(shù)據(jù),不會影響資源的內(nèi)容。無論進行多少次操作,結(jié)果都是一樣的。

并且GET請求會把請求的參數(shù)附加在URL后面,但是不同的瀏覽器對其有不同的大小長度限制。

在本案例中,我們設(shè)計兩個GET請求的API。

GET /dogs :用來返回dog資源的列表。

GET /dogs/{dogid} :用來查詢此id的單個dog資源。

POST請求用來新增一個資源 : POST請求向服務(wù)器發(fā)送數(shù)據(jù),但是該請求會改變數(shù)據(jù)的內(nèi)容(新添),就像數(shù)據(jù)庫的insert操作一樣,會創(chuàng)建新的內(nèi)容。且POST請求的請求參數(shù)都是請求體中,其大小是沒有限制的。

在本案例中,我們設(shè)計以下POST請求的API。

POST /dogs :服務(wù)端新增一個dog資源。

PUT請求用來更新資源,PUT請求是向服務(wù)器端發(fā)送數(shù)據(jù)的, 與POST請求不同的是,PUT請求側(cè)重于數(shù)據(jù)的修改 ,就像數(shù)據(jù)庫中update一樣,而POST請求側(cè)重于數(shù)據(jù)的增加。

在本案例中,我們設(shè)計以下POST請求的API。

PUT /dogs/{dogid} :用來更新此id的單個dog資源。

DELETE 請求用來刪除資源,DELETE請求用途和它字面意思一致,用來刪除資源。和數(shù)據(jù)庫中delete相對應(yīng)。

在本案例中,我們設(shè)計以下DELETE請求的API。

DELETE /dogs/{dogid} :用來刪除此id的單個dog資源。

對應(yīng)的Mapper文件為:

  1. package com.restfuldemo.mapper; 
  2.  
  3. import com.restfuldemo.pojo.Dog; 
  4. import org.apache.ibatis.annotations.*; 
  5. import java.util.List; 
  6.  
  7. @Mapper 
  8. public interface DogMapper { 
  9.  
  10.     @Select("select * from dog"
  11.     List<Dog> getAllDog(); 
  12.  
  13.     @Select("select * from dog where id=#{id}"
  14.     Dog getDogById(@Param("id"int id); 
  15.  
  16.     @Insert("insert into dog (name,age) values (#{name},#{age})"
  17.     boolean addDog(Dog dog); 
  18.  
  19.     @Update("update dog set name=#{name},age=#{age} where id=#{id}"
  20.     boolean updateDog(Dog dog); 
  21.  
  22.     @Delete("delete  from dog where id=#{id}"
  23.     boolean deleteDogById(int id); 

對應(yīng)controller文件為:

  1. package com.restfuldemo.controller; 
  2.  
  3. import com.restfuldemo.mapper.DogMapper; 
  4. import com.restfuldemo.pojo.Dog; 
  5. import org.springframework.beans.factory.annotation.Autowired; 
  6. import org.springframework.web.bind.annotation.*; 
  7.  
  8. import java.util.Arrays; 
  9. import java.util.List; 
  10.  
  11. @RestController 
  12. public class TestController { 
  13.  
  14.     @Autowired(required = false
  15.     DogMapper dogMapper; 
  16.  
  17.     @GetMapping("dogs"
  18.     public List<Dog> getDogs() 
  19.     { 
  20.         return  dogMapper.getAllDog(); 
  21.     } 
  22.  
  23.     @GetMapping("dogs/{id}"
  24.     public Dog getDogById(@PathVariable("id"int id) 
  25.     { 
  26.         Dog dog=dogMapper.getDogById(id); 
  27.         return  dog; 
  28.     } 
  29.     @PostMapping("dogs"
  30.     public boolean addDog(Dog dog) 
  31.     { 
  32.         return dogMapper.addDog(dog); 
  33.     } 
  34.     @PutMapping("dogs/{id}"
  35.     public boolean updateDog(@PathVariable("id")int id,@RequestParam("name")String name,@RequestParam("age")int age) 
  36.     { 
  37.  
  38.         Dog dog=dogMapper.getDogById(id); 
  39.         dog.setName(name); 
  40.         dog.setAge(age); 
  41.         return  dogMapper.updateDog(dog); 
  42.     } 
  43.  
  44.     @DeleteMapping("dogs/{id}"
  45.     public boolean deleteDog(@PathVariable("id"int id) 
  46.     { 
  47.         return  dogMapper.deleteDogById(id); 
  48.     } 

經(jīng)過筆者測試一切都是ok的。

總結(jié)

RESTful風(fēng)格的API 固然很好很規(guī)范,但大多數(shù)互聯(lián)網(wǎng)公司并沒有按照或者完全按照其規(guī)則來設(shè)計,因為REST是一種風(fēng)格,而不是一種約束或規(guī)則,過于理想的RESTful API 會付出太多的成本。

比如RESTful API也有一些缺點

  • 比如操作方式繁瑣,RESTful API通常根據(jù)GET、POST、PUT、DELETE 來區(qū)分操作資源的動作,而HTTP Method 本身不可直接見,是隱藏的,而如果將動作放到URL的path上反而清晰可見,更利于團隊的理解和交流。
  • 并且有些瀏覽器對GET,POST之外的請求支持不太友好,還需要特殊額外的處理。
  • 過分強調(diào)資源,而實際業(yè)務(wù)API可能有各種需求比較復(fù)雜,單單使用資源的增刪改查可能并不能有效滿足使用需求,強行使用RESTful風(fēng)格API只會增加開發(fā)難度和成本。

所以,當(dāng)你或你們的技術(shù)團隊在設(shè)計API的時候,如果使用場景和REST風(fēng)格很匹配,那么你們可以采用RESTful 風(fēng)格API。但是如果業(yè)務(wù)需求和RESTful風(fēng)格API不太匹配或者很麻煩,那也可以不用RESTful風(fēng)格API或者可以借鑒一下,畢竟無論那種風(fēng)格的API都是為了方便團隊開發(fā)、協(xié)商以及管理,不能墨守成規(guī)。

到這里RESTful API的介紹和實戰(zhàn)就結(jié)束啦,本篇首先從RESTful的一些特點進行介紹,再到SpringBoot實戰(zhàn)RESTful API,最后也說了一些RESTful API并不完美的地方,相信睿智的你對RESTful 一定有了很深刻的理解。在以后項目的API設(shè)計上定能有所優(yōu)化。

不同的人對RESTful API可能有著不同的理解,但存在即合理,RESTful API有著其鮮明的優(yōu)勢和特點,目前也是一種API設(shè)計的主要選型之一,所以掌握和理解RESTful API還是相當(dāng)重要的!

 

責(zé)任編輯:姜華 來源: bigsai
相關(guān)推薦

2021-03-04 09:26:57

微服務(wù)架構(gòu)數(shù)據(jù)

2019-12-19 17:00:01

Java線程

2019-12-25 10:45:30

Java悲觀鎖

2021-10-26 14:35:10

架構(gòu)

2020-08-14 07:58:03

代碼庫代碼開發(fā)

2017-10-10 16:22:21

主板芯片硬件

2021-04-23 09:50:41

topLinux命令

2021-02-16 09:17:40

VimLinux編輯器

2011-06-12 18:30:07

投影機技巧

2009-11-25 09:02:12

2018-04-26 14:10:08

裝機AMDCPU

2021-09-06 07:58:47

鏈表數(shù)據(jù)結(jié)構(gòu)

2017-06-07 18:40:33

PromiseJavascript前端

2022-03-08 08:39:22

gRPC協(xié)議云原生

2009-11-05 10:56:31

WCF通訊

2019-01-28 18:32:37

數(shù)據(jù)分析Python

2020-04-06 14:53:05

MySQL數(shù)據(jù)庫字符串

2019-09-02 08:08:30

緩存HTTP數(shù)據(jù)庫

2015-12-03 14:10:26

systemd容器Linux

2023-07-15 18:26:51

LinuxABI
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲91视频 | 国产欧美精品 | 国产成人99久久亚洲综合精品 | 色屁屁在线观看 | 亚洲免费在线 | 成人精品一区亚洲午夜久久久 | 香蕉一区二区 | 国产精品欧美一区二区三区不卡 | 免费一区二区三区 | 色久影院 | 日韩在线不卡 | 欧美精品一区二区在线观看 | 欧美另类视频在线 | 久久久久久99 | 久久久久久久久久久久久久国产 | 三级成人在线 | 99欧美精品 | 人人干人人干人人干 | av在线播放网址 | 东京久久 | 国产精品 欧美精品 | av手机在线 | 一级毛片免费 | 一级片av | 国产成人精品av | 久久久久久蜜桃一区二区 | www久久国产 | 一区二区三区回区在观看免费视频 | 麻豆a级片| 国产精品爱久久久久久久 | 免费黄色av网站 | 午夜精品久久久久久久久久久久久 | 久久久久久久电影 | 色偷偷噜噜噜亚洲男人 | 人人种亚洲| 美女视频h | 亚洲高清网 | 中文字幕国产视频 | 婷婷久久综合 | 久久久人成影片一区二区三区 | 国产精品欧美一区二区 |