Web API接口規范與測試方法


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是如何進行接口的編寫的

  • 訪問測試網站

  • 創建接口項目

  • 創建接口

  • 編寫接口

img

img

1.3接口測試工具:Postman

Postman是一款接口調試工具,是一款免費的可視化軟件,同時支持各種操作系統平台,是測試接口的首選工具。

Postman可以直接從官網:https://www.getpostman.com/downloads/下載獲得,然后進行傻瓜式安裝。

  • 工作面板

img

  • 簡易的get請求

img

  • 簡易的post請求

img

  • 案例:請求百度地圖接口

img

2.接口規范(restful)

RESTful(Representational State Transfer)是目前較為流行的Web API 的設計規范,特點:簡單、易上手。

2.1URL設計

2.1.1 數據的安全保障(https)

  • url鏈接一般都采用https協議進行傳輸

    注:采用https協議,可以提高數據交互過程中的安全性

2.1.2 接口特征表現

接口用來操作數據,與網址(操作頁面)有區別,所以用特定的關鍵字表示接口。

2.1.3 多數據版本共存

2.1.4 數據即是資源

2.1.5 資源操作由請求方式決定

  • 操作資源一般都會涉及到增刪改查,我們提供請求方式來標識增刪改查動作

  • get:獲取單個或多個資源

  • post:新增單個或多個資源

    • https://api.baidu.com/books - post請求:新增一本書
      單增,提交單個數據字典,完成單增,返回單個結果對象
      群增,提供多個數據字典的數組,完成群增,返回多個結果對象
  • put:整體修改單個或多個資源

  • patch:局部修改單個或多個資源,修改方式與put完全相同,不同的是操作的資源如果有多個k-v鍵值對,put請求返回的字典包含所有數據,而patch請求返回的數據則可以是字典中任意的(可選擇,指定的一個或多個)鍵值對。

  • delete:刪除單個或多個資源,

單刪,不需要提供額外數據,完成單刪,不做任何資源返回(一般我們會返回結果信息:成功|失敗)

多刪,提供多個資源主鍵數據,完成群刪,不做任何資源返回(一般我們會返回結果信息:成功|失敗)

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窗口查看所有變量的名稱空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM