1.Web API接口
接口:規定了提交請求參數的請求方式、訪問其可以獲取相應的反饋數據的url鏈接,四部分:url鏈接 + 請求方式 + 請求參數 + 響應數據。
1.1接口的四大特點
-
url:長得像返回數據的url鏈接
-
請求方式:get、post、put、patch、delete
- 采用get方式請求上方接口
-
請求參數:json或xml格式的key-value類型數據
- ak:6E823f587c95f0148c19993539b99295
- region:上海
- query:肯德基
- output:json
-
響應結果:json或xml格式的數據
-
上方請求參數的output參數值決定了響應數據的格式
-
{ "status":0, "message":"ok", "results":[ { "name":"肯德基(羅餐廳)", "location":{ "lat":31.415354, "lng":121.357339 }, "address":"月羅路2380號", "province":"上海市", "city":"上海市", "area":"寶山區", "street_id":"339ed41ae1d6dc320a5cb37c", "telephone":"(021)56761006", "detail":1, "uid":"339ed41ae1d6dc320a5cb37c" } ... ] }
-
1.2接口文檔的編寫:YApi
YApi是去哪網大前端技術中心的一個開源可視化接口管理平台。
YApi項目可以搭建在任何本地或雲服務器上,完成后台項目開發時的接口編寫。為開發、測試等人員提供可視化的接口預覽。
去哪同時在網上提供了YApi的測試網站:http://yapi.demo.qunar.com/,我們可以通過測試網站了解YApi是如何進行接口的編寫的
- 訪問測試網站
- 創建接口項目
- 創建接口
- 編寫接口
1.3接口測試工具:Postman
Postman是一款接口調試工具,是一款免費的可視化軟件,同時支持各種操作系統平台,是測試接口的首選工具。
Postman可以直接從官網:https://www.getpostman.com/downloads/下載獲得,然后進行傻瓜式安裝。
- 工作面板
- 簡易的get請求
- 簡易的post請求
- 案例:請求百度地圖接口
2.接口規范(restful)
RESTful(Representational State Transfer)是目前較為流行的Web API 的設計規范,特點:簡單、易上手。
2.1URL設計
2.1.1 數據的安全保障(https)
-
url鏈接一般都采用https協議進行傳輸
注:采用https協議,可以提高數據交互過程中的安全性
2.1.2 接口特征表現
接口用來操作數據,與網址(操作頁面)有區別,所以用特定的關鍵字表示接口。
-
用api關鍵字標識接口url:
注:看到api代表該請求url鏈接是完成前后台數據交互的。
2.1.3 多數據版本共存
-
如果一個資源存在多版本結果,在url鏈接中要用特定符號來兼容多版本共存如v1,v2
注:url鏈接中的v1、v2就是不同數據版本的體現
2.1.4 數據即是資源
-
接口一般都是完成前后台數據的交互,交互的數據我們稱之為資源
注:一般提倡用資源的復數形式,在url鏈接中盡量不要出現操作資源的動詞,錯誤示范:https://api.baidu.com/delete-user
-
特殊的接口可以出現動詞,因為這些接口一般沒有一個明確的資源,或是動詞就是接口的核心含義
-
群資源操作,一般還有額外的限制條件,如排序、限制調試、分頁等等,如:
2.1.5 資源操作由請求方式決定
-
操作資源一般都會涉及到增刪改查,我們提供請求方式來標識增刪改查動作
-
get:獲取單個或多個資源
- https://api.baidu.com/books - get請求:獲取所有書
- https://api.baidu.com/books/1 - get請求:獲取主鍵為1的書
-
post:新增單個或多個資源
- https://api.baidu.com/books - post請求:新增一本書
單增,提交單個數據字典,完成單增,返回單個結果對象
群增,提供多個數據字典的數組,完成群增,返回多個結果對象
- https://api.baidu.com/books - post請求:新增一本書
-
put:整體修改單個或多個資源
-
https://api.baidu.com/books/1 - put請求:整體修改主鍵為1的書,完成單改,返回單個結果對象
-
https://api.baidu.com/books/ 整體修改多個數據,提供多個數據字典的數字(數據字典要包含主鍵),完成群改,返回多個結果對象
-
-
patch:局部修改單個或多個資源,修改方式與put完全相同,不同的是操作的資源如果有多個k-v鍵值對,put請求返回的字典包含所有數據,而patch請求返回的數據則可以是字典中任意的(可選擇,指定的一個或多個)鍵值對。
-
delete:刪除單個或多個資源,
單刪,不需要提供額外數據,完成單刪,不做任何資源返回(一般我們會返回結果信息:成功|失敗)
- https://api.baidu.com/books/1 刪除主鍵為1的書
多刪,提供多個資源主鍵數據,完成群刪,不做任何資源返回(一般我們會返回結果信息:成功|失敗)
2.2響應狀態碼
網絡狀態碼和網絡狀態信息捆綁出現,不要額外設置
2.2.1 正常響應
- 響應狀態碼2xx
- 200:常規請求
- 201:創建成功
2.2.2 重定向響應
- 響應狀態碼3xx
- 301:永久重定向
- 302:暫時重定向
2.2.3 客戶端異常
- 響應狀態碼4xx
- 403:請求無權限
- 404:請求路徑不存在
- 405:請求方法不存在
2.2.4 服務器異常
- 響應狀態碼5xx
- 500:服務器異常
2.3 響應結果
2.3.1 響應數據要有狀態碼、狀態信息以及數據本身
數據狀態碼:
'''
0:成功
1:失敗 1xx:具體失敗信息(要在接口文檔中明確寫出)
2:無數據 2xx:具體無數據信息(要在接口文檔中明確寫出)
'''
數據狀態信息
數據狀態信息一般不僅僅是對數據狀態碼的解釋,更多是對結果的描述,給前台開發者閱讀的。
{
"status": 0,
"msg": "ok",
"results":[
{
"name":"肯德基(羅餐廳)",
"location":{
"lat":31.415354,
"lng":121.357339
},
"address":"月羅路2380號",
"province":"上海市",
"city":"上海市",
"area":"寶山區",
"street_id":"339ed41ae1d6dc320a5cb37c",
"telephone":"(021)56761006",
"detail":1,
"uid":"339ed41ae1d6dc320a5cb37c"
}
...
]
}
數據結果(常量、數組、字典),如果有子資源(圖片、音頻、視頻),返回資源的url鏈接。
{
"status": 0,
"msg": "ok",
"results":[
{
"name":"肯德基(羅餐廳)",
"img": "https://image.baidu.com/kfc/001.png"
}
...
]
}
3.CBV(as_view()) 源碼分析
Django項目啟動,啟動入口為manage.py,先加載settings文件,settings文件通過字符串反射的方法加載配置文件的屬性和方法,如果我們在配置文件中將某個app注釋掉在其他app中也沒有導入該app的文件,那么該app在啟動時將不被項目加載(也不會被編譯)。
CBV的路由層:
from . import views
from django.conf.urls import url
urlpatterns = [
url(r'^books/$',views.BookView.as_view()),
url(r'^books/(?P<pk>\d+)/$',views.BookView.as_view()),
]
這里as_view是BookView的基類的方法,當項目啟動時as_view都做了哪些事情呢,來看as_view的源碼:
@classonlymethod
def as_view(cls, **initkwargs):#類方法,所以可以類名.方法名()調用
"""
Main entry point for a request-response process.
"""
# 項目剛啟動時initkwargs為空,不走下面的循環
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class." % (cls.__name__, key))
# 請求來了完成響應的函數
#wsgi協議將瀏覽器發過來的數據拆分后放入request
def view(request, *args, **kwargs):
self = cls(**initkwargs)
#類實例化的對象
#利用反射添加get請求,get和head一樣
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
# 為對象添加屬性
self.request = request
self.args = args #無名分組參數
self.kwargs = kwargs # 有名分組的參數
#將執行結果返回到前台
return self.dispatch(request, *args, **kwargs)
#下面兩句的作用:將請求調用view的信息保存在view對象中
view.view_class = cls
#將類名添加到view的名稱空間
view.view_initkwargs = initkwargs
#將as_view攜帶的參數添加到名稱空間
# take name and docstring from class
update_wrapper(view, cls, updated=())
# and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
#返回請求調用的函數地址,進行路由綁定
return view
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
dispatch方法
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
#通過反射的方式判斷請求的方法是否存在,如果存在就加()調用,不存在就報錯
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
4.使用pycharm查看一個py文件的成員
5.Pycharm debug窗口的使用
5.1 操作步驟:
5.1.1添加斷點:直接在標記處點擊鼠標左鍵即可。(刪除斷點只需再點擊斷點處即可)
5.1.2Debug下運行代碼:先對需要找bug的部分代碼打斷點,然后點擊工作欄的瓢蟲,就進入了debug模式。
5.1.3按照所需調試進行代碼調試。Debug的調試方式如下所示:
分別為:
1.show execution point (Alt+F10) 顯示當前所有斷點
2.step over(F8) 單步調試。
若函數A內存在子函數a時,不會進入子函數a內執行單步調試,而是把子函數a當作一個整體,一步執行。
3.step into(F7) 單步調試。
若函數A內存在子函數a時,會進入子函數a內執行單步調試。
4.step into my code(Alt + Shift +F7) 執行下一行但忽略libraries(導入庫的語句)
5.force step into(Alt + Shift +F7) 執行下一行忽略lib和構造對象等 (目前感覺沒什么用)
6.step out(Shift+F8)當目前執行在子函數a中時,選擇該調試操作可以直接跳出子函數a,而不用繼續執行子函數a中的剩余代碼。並返回上一層函數。
7.run to cursor(Alt +F9) 直接跳到下一個斷點
9.臨時禁用斷點,可以將斷點全部禁用
10.快速查看與取消斷點
11.在debug窗口查看所有變量的名稱空間