面試筆記一
一、MySQL
1、mysql如何做分頁
mysql資料庫做分頁用limit關鍵字,它後面跟兩個引數startIndex和pageSize
2、mysql引擎有哪些,各自的特點是什麼?
innodb和myisam兩個引擎,兩者區別是
innodb支援事物,myisam不支援
innodb支援外來鍵,myisam不支援
innodb不支援全文索引,myisam支援全文索引
innodb提供提交、回滾、崩潰恢復能力的事物的安全能力,實現併發控制
myisam提供較高的插入和查詢記錄的效率,主要用於插入和查詢
3、資料庫怎麼建立索引
create index account_index on `table name `(`欄位名`(length)
4、一張表多個欄位,怎麼建立組合索引
create index account_index on `table name `(`欄位名`,'欄位名')
5、如何應對資料的高併發,大量的資料計算
1.建立索引
2.資料庫讀寫分離,兩個資料庫,一個作為寫,一個作為讀
3. 外來鍵去掉
4.django中orm表效能相關的
select_related:一對多使用,查詢主動做連表
prefetch_related:多對多或者一對多的時候使用,不做連表,做多次查詢
6、資料庫內連表、左連表、右連表
內連線是根據某個條件連線兩個表共有的資料
左連線是根據某個條件以及左邊的表連線資料,右邊的表沒有資料的話則為null
右連線是根據某個條件以及右邊的表連線資料,左邊的表沒有資料的話則為null
7、檢視和表的區別
檢視是已經編譯好的sql語句,是基於sql語句的結果集的視覺化的表,而表不是
檢視是視窗,表示內容
檢視沒有實際的物理記錄,而表有
檢視的建立和刪除隻影響檢視本身,不影響對應的表
8、關係型資料庫的特點
資料集中控制
資料獨立性高
資料共享性好
資料冗餘度小
資料結構化
統一的資料保護能力
9、mysql資料庫都有哪些索引
普通索引:普通索引僅有一個功能:加速查詢
唯一索引:唯一索引兩個功能:加速查詢和唯一約束(可含null)
外來鍵索引:外來鍵索引兩個功能:加速查詢和唯一約束(不可為null)
聯合索引:聯合索引是將n個列組合成一個索引,應用場景:同時使用n列來進行查詢
10、儲存過程
儲存過程不允許執行return語句,但是可以通過out引數返回多個值,儲存過程一般是作為一個獨立的部分來執行,儲存過程是一個預編譯的SQL語句。
11、sql優化:
select句中避免使用 '*'
減少訪問資料庫的次數
刪除重複記錄
用where子句替代having子句
減少對錶的查詢
explain
12、char和vachar區別:
char是固定長度,儲存需要空間12個位元組,處理速度比vachar快,費記憶體空間
vachar是不固定長度,需要儲存空間13個位元組,節約儲存空間
13、Mechached與redis
mechached:只支援字串,不能持久化,資料僅存在記憶體中,宕機或重啟資料將全部失效
不能進行分散式擴充套件,檔案無法非同步法。
優點:mechached程序執行之後,會預申請一塊較大的記憶體空間,自己進行管理。
redis:支援伺服器端的資料型別,redis與memcached相比來說,擁有更多的資料結構和併發支援更豐富的資料操作,可持久化。
五大型別資料:string、hash、list、set和有序集合,redis是單程序單執行緒的。
缺點:資料庫的容量受到實體記憶體的限制。
14、sql注入
sql注入是比較常見的攻擊方式之一,針對程式設計員程式設計的疏忽,通過sql語句,實現賬號無法登陸,甚至篡改資料庫。
防止:凡涉及到執行sql中有變數時,切記不要用拼接字串的方法
15、什麼是觸發器
觸發器是一種特殊的儲存過程,主要是通過事件來觸發而被執行的,他可以強化約束,來維護資料庫的完整性和一致性,可以跟蹤資料內的操作從而不允許未經許可的 更新和變化,可以聯級運算。
只有表支援觸發器,檢視不支援觸發器
16、遊標是什麼?
是對查詢出來的結果集作為一個單元來有效的處理,遊標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行,可以對結果集當前行做修改,
一般不使用遊標,但是需要逐條處理資料的時候,遊標顯得十分重要
17、 資料庫支援多有標準的SQL資料型別,重要分為三類
數值型別(tinyint,int,bigint,浮點數,bit)
字串型別(char和vachar,enum,text,set)
日期型別(date,datetime,timestamp)
18、mysql慢查詢
慢查詢對於跟蹤有問題的查詢很有用,可以分析出當前程式裡哪些sql語句比較耗費資源
慢查詢定義:
指mysql記錄所有執行超過long_query_time引數設定的時間值的sql語句,慢查詢日誌就是記錄這些sql的日誌。
mysql在windows系統中的配置檔案一般是my.ini找到mysqld
log-slow-queries = F:\MySQL\log\mysqlslowquery.log 為慢查詢日誌存放的位置,一般要有可寫許可權
long_query_time = 2 2表示查詢超過兩秒才記錄
19、memcached命中率
命中:可以直接通過快取獲取到需要的資料
不命中:無法直接通過快取獲取到想要的資料,需要再次查詢資料庫或者執行其他的操作,原因可能是由於快取中根本不存在,或者快取已經過期
快取的命中率越高則表示使用快取的收益越高,應額用的效能越好,抗病發能力越強
執行state命令可以檢視memcached服務的狀態資訊,其中cmd—get表示總的get次數,get—hits表示命中次數,命中率=get—hits / cmd—get
20、Oracle和MySQL該如何選擇,為什麼?
他們都有各自的優點和缺點。考慮到時間因素,我傾向於MySQL
選擇MySQL而不選Oracle的原因
MySQL開源
MySQL輕便快捷
MySQL對命令列和圖形介面的支援都很好
MySQL支援通過Query Browser進行管理
21、什麼情況下適合建立索引?
1.為經常出現在關鍵字order by、group by、distinct後面的欄位,建立索引
2.在union等集合操作的結果集欄位上,建立索引,其建立索引的目的同上
3.為經常用作查詢選擇的欄位,建立索引
4.在經常用作表連線的屬性上,建立索引
22、資料庫底層是用什麼結構實現的,你大致畫一下:
底層用B+數實現,結構圖參考:
http://blog.csdn.net/cjfeii/article/details/10858721
http://blog.csdn.net/tonyxf121/article/details/8393545
23、sql語句應該考慮哪些安全性?
1.防止sql注入,對特殊字元進行轉義,過濾或者使用預編譯的sql語句繫結變數
2.最小許可權原則,特別是不要用root賬戶,為不同的型別的動作或者組建使用不同的賬戶
3.當sql執行出錯時,不要把資料庫返回的錯誤資訊全部顯示給使用者,以防止洩漏伺服器和資料庫相關資訊
24、資料庫事物有哪幾種?
隔離性、持續性、一致性、原子性
25、MySQ資料表在什麼情況下容易損壞?
伺服器突然斷電導致資料檔案損壞
強制關機,沒有先關閉mysq伺服器等
26、drop,delete與truncate的區別
drop直接刪除表
truncate刪除表中資料,再插入時自增長id又從1開始
delete刪除表中資料,可以加where子句
27、資料庫正規化
1.第一正規化:就是無重複的列
2.第二正規化:就是非主屬性非部分依賴於主關鍵字
3.第三正規化:就是屬性不依賴於其他非主屬性(消除冗餘)
28、MySQL鎖型別
根據鎖的型別分:可以分為共享鎖、排他鎖、意向共享鎖和意向排他鎖
根據鎖的粒度分:可以分為行鎖、表鎖
對於mysql而言,事務機制更多是靠底層的儲存引擎來實現的,因此,mysql層面只有表鎖,
而支援事物的innodb儲存引起則實現了行鎖(在行相應的索引記錄上的鎖)
說明:對於更新操作(讀不上鎖),只有走索引才可能上行鎖
MVCC(多版本併發控制)併發控制機制下,任何操作都不會阻塞讀取操作,
讀取操作也不會阻塞任何操作,只因為讀不上鎖
共享鎖:由讀表操作加上的鎖,加鎖後其他使用者只能獲取該表或行的共享鎖,不能獲取排他鎖,
也就是說只能讀不能寫
排他鎖:由寫表操作加上的鎖,加鎖後其他使用者不能獲取該表或該行的任何鎖,典型mysql事物中的更新操作
意向共享鎖(IS):事物打算給資料行加行共享鎖,事物在給一個數據行加共享鎖前必須先取得該表的IS鎖
意向排他鎖(IX):事物打算給資料行加行排他鎖,事物在給一個數據行家排他鎖前必須先取得該表的IX鎖
29、如何解決MYSQL資料庫中文亂碼問題?
1.在資料庫安裝的時候指定字符集
2.如果在按完了以後可以更改配置檔案
3.建立資料庫時候:指定字符集型別
4.建表的時候也指定字符集
30、資料庫應用系統設計
1.規劃
2.需求分析
3.概念模型設計
4.邏輯設計
5.物理設計
6. 程式編制及除錯
7.執行及維護
二、django
1、中介軟體
中介軟體一般做認證或批量請求處理,django中的中介軟體,其實是一個類,在請求和結束後,django會根據自己的規則在合適的時機執行中介軟體中相應的方法,
如請求過來 執行process_request, view,process_response方法
2、Django、Tornado、Flask各自的優勢
Django:Django無socket,django的目的是簡便,快速開發,並遵循MVC設計,多個元件可以很方便的以“外掛”形式服務於整個框架,
django有許多功能強大的第三方外掛。django具有很強的可擴充套件性。
Tornado:它是非阻塞式伺服器,而且速度相當快,得力於其 非阻塞的方式和對epoll的運用,Future物件,缺點:沒有session,需要自定製
Flask:是一個微型的web框架,配合SQLALchemy來使用,jinja2模板, werkzeug介面
3、 django版本,Python版本,linux版本
django:1.11
Python:3.5
linux:6.8
4、django的template的註釋是什麼樣子的
單行:{#註釋#}
多行註釋:{%comment%}
5、django怎麼弄併發的
nginx+uwsig為django提供高併發,nginx的併發能力超過,單臺併發能力過完,在純靜態的web服務中更是突出其優越的地方,由於底層使用epoll非同步IO模型進行處理。
6、tornodo的ioloop知道是什麼嗎?
事件迴圈
7、select_related和prefetch_related,Q和F
select_related:一對多使用,查詢主動做連表
prefetch_related:多對多或者一對多的時候使用,不做連表,做多次查詢
Q:用於構造複雜查詢條件
F:更新時用於獲取原來的值,專門取物件中某一列進行操作
8、什麼是ORM?
ORM,即Object-Relational Mapping(物件關係對映),它的作用是在關係型資料庫和業務實體物件之間做一個對映
ORM優缺點:
優點:擺脫複雜的SQL操作,適應快速開發,讓資料結果變得簡單,資料庫遷移成本更低
缺點:效能較差,不適用於大型應用,複雜的SQL操作還需要通過SQL語句實現
9、CORS跨域資源共享
首先會發送"預檢"opption",請求,如果"預檢"成功,則傳送真實資料。
10、Django的Form主要具有以下功能?
生成HTMl標籤,驗證使用者資料 is_vaild,HTML Form提交保留上次提交資料,初始化頁面顯示內容
11、CBV和FBV
CBV在指定的類上面加上裝飾器或在此方法上面新增裝飾器 @method_decorator,並繼承view
12、cookie及session
cookie:是保留在客戶端上面的一組鍵值對,cookie不是很安全,別人可以分析存放在本地的cookie
session:是儲存在伺服器上面的一組鍵值對,依賴與cookie,安全指數比cookie高
13、django的請求生命週期
請求來了先到uwsgi,把請求做一部分分裝給django框架,然後經過所有的中介軟體,路由,檢視,檢視處理再返回給中介軟體,中介軟體在返回給uwsgi,在返回給使用者。
14、uwsgi和wsgi
wsgi:是web伺服器閘道器介面,是pyhton應用程式或框架和web伺服器之間的一種介面,其廣泛使用的是django框架。
uwsgi:是一個web伺服器,它實現了wsgi協議,Nginx中HttpUwsgiModule的作用是與Uwsgi伺服器進行交換
15、解釋下django - debug -toolbar的使用
使用django開發站點時,可以使用django-debug-toolbar來進行除錯,在settings.py中新增 'debug—toolbar.midleware.Debug ToolbarMiddleware'到專案的MIDDLEWARE_CLASSES內。
三、Python部分
1、 __new__.__init__區別,如何實現單例模式,有什麼優點
__new__是一個靜態方法,__init__是一個例項方法
__new__返回一個建立的例項,__init__什麼都不返回
__new__返回一個cls的例項時後面的__init__才能被呼叫
當建立一個新例項時呼叫__new__,初始化一個例項時呼叫__init__
2、深淺拷貝
淺拷貝只是增加了一個指標指向一個存在的地址,而深拷貝是增加一個指標並且開闢了新的記憶體,這個增加的指標指向這個新的記憶體,
採用淺拷貝的情況,釋放記憶體,會釋放同一記憶體,深拷貝就不會出現釋放同一記憶體的錯誤
3、HTTP/IP相關協議,分別位於哪層
http協議是超文字傳輸協議,http協議是基於TCP/IP通訊協議來傳遞資料
http協議工作與c/s架構上,瀏覽器作為http的客戶端通過URL向http服務端即web伺服器傳送所用請求。web伺服器收到所有請求後,向客戶端傳送響應資訊,
http特點是短連線,無狀態
位址列鍵輸入URL,按下回車之後經歷了什麼?
1.瀏覽器向DNS伺服器請求解析該URL中的域名所對應的IP地址
2.解析出IP地址後,根據IP地址和預設埠80,和伺服器建立TCP連線
3.瀏覽器發出讀取檔案的http請求,該請求報文作為TCP三次握手的第三個報文的資料傳送給伺服器
4.伺服器對瀏覽器請求做出響應,並把對應的html檔案傳送給瀏覽器
5.釋放TCP連線
6.瀏覽器將該HMTL渲染並顯示內容
4、TCP/UDP區別
TCP協議是面向連線,保證高可靠性(資料無丟失,資料無失序,資料無錯誤,資料無重複達到)傳輸層協議
UDP:資料丟失,無秩序的傳輸層協議(qq基於udp協議)
5、webscoket
websocket是基於http協議的,可持續化連線
輪詢:瀏覽器每隔幾秒就傳送一次請求,詢問伺服器是否有新訊息
長輪詢:客戶端發起連線後,如果沒有訊息,就一直不返回response給客戶端,直到有訊息返回,返回完之後,客戶端再次發起連線
6、RabbitMQ:
伺服器端有Erlang語言來編寫,支援多種客戶端,只會ajax,用於分散式系統中儲存轉發訊息,在易用性、擴充套件性、高可用性的方面不俗。
connection是RabbitMQ的socket連線,它封裝了socket部分相關協議邏輯
connectionFactroy為connection的製造工廠
channel是我們與RabbitMQ打交道的最重要的一個介面,大部分的業務操作是在chaanel這個介面中完成,包括定義Queue、定義Exchange、
繫結Queue與Exchange,釋出訊息等
7、裝飾器
呼叫裝飾器其實是一個閉包函式,為其他函式新增附加功能,不修改被修改的原始碼和不修改被修飾的方式,裝飾器的返回值也是一個函式物件。
比如:插入日誌、效能測試、事物處理、快取、許可權驗證等,有了裝飾器,就可以抽離出大量與函式功能本身無關的雷同程式碼並繼續重用。
8、閉包
1.必須有一個內嵌函式
2.內嵌函式必須引用外部函式的變數(該函式包含對外作用域而不是全域性作用域名字的引用)
3.外部函式的返回值必須是內嵌函式
9、迭代器與生成器
迭代可迭代物件對應_iter_(方法)和迭代器對應_next_(方法)的一個過程
生成器:包括含有yield這個關鍵字,生成器也是迭代器,調動next把函式變成迭代器。
10、classmethod,staticmethod,property
類方法:將類的函式轉換成類方法,函式上裝飾@classmethod會將函式的自動傳值引數改成cls
靜態方法:此方法相當於給類擴充套件一個功能,將類內的函式例項化,給類或物件使用,此時類內的函式就是普通函式,不管是類還是例項化的物件都可以使用
例項化:類的例項化就會產生一個例項(物件),可以理解為類()把虛擬的東西例項化,得到具體存在的值
11、常用的狀態碼
200--伺服器成功返回網頁
204--請求收到,但返回資訊為空
304--客戶端已經執行了GET,但檔案未變化
400--錯誤請求,如語法錯誤
403--無許可權訪問
404--請求的頁面不存在
500--伺服器產生內部錯誤
12、多程序,多執行緒,協程,GIL
GIL:全域性直譯器鎖,是鎖在cpython直譯器上,導致同一時刻,同一程序只能有一個執行緒被執行
多程序:多程序模組multiprocessing來實現,cpu密集型,IO計算型可以用多程序
多執行緒:多執行緒模組threading來實現,IO密集型,多執行緒可以提高效率
協程:依賴於geenlet,對於多執行緒應用。cpu通過切片的方式來切換執行緒間的執行,遇到IO操作自動切換,執行緒切換時需要耗時,
而協成好處沒有切換的消耗,沒有鎖定概念。
程序:是資源管理單位,進行是相互獨立的,實現併發和併發
執行緒:是最小的執行單位,執行緒的出現為了降低上下文切換的消耗,提供系統的併發性
13、IO多路複用/非同步非阻塞
IO多路複用:通過一種機制,可以監聽多個描述符 select/poll/epoll
select:連線數受限,查詢配對速度慢,資料由核心拷貝到使用者態
poll:改善了連線數,但是還是查詢配對速度慢,資料由核心拷貝到使用者態
epoll:epoll是linux下多路複用IO介面,是select/poll的增強版,它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統CPU利用率
非同步非阻塞:非同步體現在回撥上,回撥就是有訊息返回時告知一聲兒程序進行處理。非阻塞就是不等待,不需要程序等待下去,
繼續執行其他操作,不管其他程序的狀態。
14、PEP8規範,規範的好處是什麼?
1.縮排:4個空實現縮排,儘量不使用Tab
2.行:沒行最大長度不超過79,換行可以使用反斜槓
3.命名規範:
4.註釋規範:
15、range-and-xrange
都在迴圈時使用,xrange記憶體效能更好,xrange用法與range完全相同,range一個生成list物件,xrange是生成器
16、with上下文機制原理
_enter_和_exit_,上下文管理協議,即with語句,為了讓一個物件相容with語句,必須在這個物件類中宣告_enter_和_exit_方法,
使用with語句的目的就是把程式碼塊放入with中執行,with結束後,自動完成清理工作,無須收到干預
17、經典類、新式類
經典類遵循:深度優先,python2中
新式類遵循:廣度優先,Python3中
18、有沒有一個工具可以幫助查詢Python的bug和進行靜態的程式碼分析?
PyChecker是一個Python程式碼的靜態分析工具,它可以幫助查詢Python程式碼的bug,會對程式碼的複雜度和格式提出警告,
Pylint是另外一個工具可以進行codingstandard檢查
19、 Python是如何進行記憶體管理的
1.物件引用計數:
引用計數增加的情況:
來保持追蹤記憶體中的物件,所有物件都用引用計數,一個物件分配一個新名稱
將其放入一個容器中(列表,字典,元祖)
引用計數減少的情況:
使用del語句對物件別名顯示的銷燬
引用超出作用域或被重新賦值
sys.getrefcount()函式可以獲得物件的當前引用計數
2.標記-清除機制
3.分代技術
20、什麼是python?使用python有什麼好處?
python是一種程式語言,它有物件、模組、執行緒、異常處理和自動記憶體管理。它簡潔,簡單、方便、容易擴充套件、有許多自帶的資料結果,而且它開源
21、什麼是pickling和unpickling?
Pickle模組讀入任何python物件,將它們轉換成字串,然後使用dump函式將其轉儲到一個檔案中——這個過程叫做pickling
反之從儲存的字串檔案中提取原始python物件的過程,叫做unpickling
22、python是如何被解釋的?
Python是一種解釋性語言,它的原始碼可以直接執行,Python直譯器會將原始碼轉換成中間語言,之後再翻譯成機器碼再執行
23、陣列和元祖之間的區別是什麼?
陣列和元祖之間的區別:陣列內容可以被修改,而元祖內容是隻讀的,不可被修改的,另外元祖可以被雜湊,比如作為字典的key
24、引數按值傳遞和引用傳遞是怎麼實現的?
python中的一切都是類,所有的變數都是一個物件的引用。引用的值是由函式確定的,因此無法被改變,但是如果一個物件是可以被修改的,你可以改動物件
25、Python都有哪些自帶的資料結構?
Python自帶的資料結構分為可變和不可變的:可變的有:陣列、集合、字典,不可變的是:字串、元祖、整數
26、什麼是python的名稱空間?
在python中,所有的名字都存在於一個空間中,它們在改空間中存在和被操作——這就是名稱空間,它就好像一個盒子,在每個變數名字都對應裝著一個物件,
當查詢變數的時候,會從該盒子裡面尋找相應的物件
27、python中的unittest是什麼?
在python中,unittest是python中的單元測試框架,它擁有支援共享搭建、自動測試、在測試中暫停程式碼、將不同測試迭代成一組
28、*args與**kwargs
*args代表位置引數,它會接收任意多個引數並把這些引數作為元祖傳遞給函式。**kwargs代表的關鍵字引數,返回的是字典,位置引數一定要放在關鍵字前面
29、在Python中什麼是slicing?
slicing是一種在有序的物件型別中(陣列、元祖、字串)節選某一段的語法
30、中的docstring是什麼?
Python中文件字串被稱為docstring,它在Python中的作用是為函式、模組和類註釋生成文件
31、os與sys區別:
os是模組負責程式與作業系統的互動,提供了訪問作業系統底層的介面
sys模組是負責程式與python直譯器的互動,提供了一系列的函式和變數,用於操控Python時執行的環境
32、實現一個單例模式
_new_()在 _init_()之前被呼叫,用於生成例項物件。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。
單例模式是指建立唯一物件,單例模式設計的類只能例項,例項化1個物件
class Singleton(object):
__instance=None
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if Singleton.__instance is None:
Singleton.__instance=object.__new__(cls,*args,**kwargs)
return Singleton.__instance
33、演算法(氣泡排序,選擇排序,插入排序)
冒泡:首先,列表每兩個相鄰的數,如果前面的比後邊的大,
那麼交換這兩個數,程式碼關鍵點:趟和無序區,
時間複雜度為:O(n2)
import random
def dublue_sort(li):
for i in range(len(li)-1):
exchange= False
for j in range(len(li)-i -1):
if li[j] > li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
exchange = True
if not exchange:
return
return li
li=list(range(100))
random.shuffle(li)
print(li)
print(dublue_sort(li))
選擇:一趟遍歷記錄最小的數,放到第一個位置,再一趟遍歷記錄剩餘列表中最小的數,
繼續放置,程式碼關鍵點:無序區和最小數的位置,時間複雜度為:O(n2)
def select_sort(li):
for i in range(len(li)-1): #i是趟
min_loc=i
#找i位置到最後位置範圍內最小的數
for j in range(i,len(li)):
if li[j] < li[min_loc]:
min_loc = j
#和無序區第一個數作交換
li[min_loc],li[i] = li[i],li[min_loc]
return li
li=list(range(100))
random.shuffle(li)
print(select_sort(li))
插入:列表被分為有序區和無序區兩個部分。最初有序區只有一個元素,
每次從無序區選擇一個元素,插入到有序區的位置,直到無序區變空,
程式碼關鍵點:摸到的牌和手裡的牌,時間複雜度為:O(n2)
def insert_sort(li):
for i in range(1,len(li)): #i 代表每次摸到的牌的下標
tmp=li[i]
j = i-1 # j代表手裡最後一張牌的下標
while True:
if j < 0 or tmp >= li[j]:
break
li[ j + 1] = li [j]
j -=1
li[j+1] = tmp
li=list(range(100))
print(insert_sort(li))
二分:列表查詢:從列表中查詢指定元素,輸入:列表、待查詢元素,輸出:元素下標或未查詢到元素。
二分查詢,從有序列表的候選區data[0:n]開始,通過對待查詢的值與候選區中間值的比較,
可以使候選區減少一半。時間複雜為:O(logn)
def bin_search(data,val):
low=0
high=len(data)-1
while low <= high :
mid= (low+high) //2
if data[mid] == val:
return mid
elif data[mid] < high :
low = mid + 1
else:
high = mid - 1
return None
print(bin_search([1,2,3,4,5,6,7,8],4))
四、RESTful API設計指南
1、協議
API與使用者的通訊協議,總是使用HTTPs協議
2、域名
應該儘量將API部署在專用域名之下
https://api.example.com
如果確定API很簡單,不會有進一步擴充套件,可以考慮放在主域名下
https://example.org/api/
3、版本
應該將API的版本號放入URL
https://api.example.com/v1/
另一種做法是:將版本號放在HTTP頭資訊中,
4、路徑
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees
5、動詞
對於資源的具體操作型別,由HTTP動詞表示
GET(SELECT):從伺服器取出資源(一項或多項)。
POST(CREATE):在伺服器新建一個資源。
PUT(UPDATE):在伺服器更新資源(客戶端提供改變後的完整資源)。
PATCH(UPDATE):在伺服器更新資源(客戶端提供改變的屬性)。
DELETE(DELETE):從伺服器刪除資源。
還有兩個不常用的HTTP動詞
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:刪除某個指定動物園的指定動物
6、過濾資訊(Filtering)
如果記錄數量很多,伺服器不可能都將它們返回給使用者,API應該提供引數,過濾返回結果
?limit=10:指定返回記錄的數量
?offset=10:指定返回記錄的開始位置。
?page=2&per_page=100:指定第幾頁,以及每頁的記錄數。
?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序。
?animal_type_id=1:指定篩選條件
7、狀態碼(Status Code)
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 - [*]:伺服器發生錯誤,使用者將無法判斷髮出的請求是否成功。