1. 接口基礎知識
1.1 接口分類
接口一般來說有兩種,一種是程序內部的接口,一種是系統對外的接口。
(1) webservice接口:走soap協議通過http傳輸,請求報文和返回報文都是xml格式的,我們在測試的時候都要通過工具才能進行調用,測試。
(2) http api 接口:走http協議,通過路徑來區分調用的方法,請求報文都是key-value形式的,返回報文一般都是json串,有get和post等方法。
1.2 接口請求類型
根據接口的請求方法,常用的幾種接口請求方式:
(1) GET:從指定資源獲取數據
(2) POST:向指定的資源請求被處理的數據(例如用戶登錄)
(3) PUT:上傳指定的URL,一般是修改,可以理解為數據庫中的 update
(4) DELETE:刪除指定資源
2、Requests 快速上手
2. requests基礎
所有的數據測試目標以一個開源的接口模擬網站【HTTPBIN】為測試對象。
2.1 發送請求
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : requests_send_request.py
@Time : 2019/9/2 11:54
@Author : Crisimple
@Github : https://crisimple.github.io/
@Contact : Crisimple@foxmail.com
@License : (C)Copyright 2017-2019, Micro-Circle
@Desc : None
"""
import requests
# 1.requests請求方式
# (1) GET請求方式
httpbin_get = requests.get('http://httpbin.org/get', data={'key': 'value'})
print('httpbin_get: ', httpbin_get.text)
# (2) POST請求方式
httpbin_post = requests.post('https://httpbin.org/post', data={'key': 'value'})
print('httpbin_post: ', httpbin_post.text)
# (3) PUT請求方式
httpbin_put = requests.put('https://httpbin.org/put', data={'key': 'value'})
print('httpbin_put: ', httpbin_put.text)
# (4) DELETE請求方式
httpbin_delete = requests.delete('https://httpbin.org/delete', data={'key': 'value'})
print('httpbin_delete', httpbin_delete)
# (5) PATCH親求方式
httpbin_patch = requests.patch('https://httpbin.org/patch', data={'key': 'value'})
print('httpbin_patch', httpbin_patch)
2.2 參數傳遞
常用的參數傳遞形式有四種:【GitHub示例】
(1)字典形式的參數:payload = {'key1': 'value1', 'key2': 'value2'}
(2) 元組形式的參數:payload = (('key1', 'value1'), ('key2', 'value2'))
(3) 字符串形式的參數:payload = {'string1', 'value1'}
(4) 多部份編碼的文件:files = {
# 顯示設置文件名、文件類型和請求頭
'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
}
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : requests_transfer_parameter.py
@Time : 2019/9/2 12:39
@Author : Crisimple
@Github : https://crisimple.github.io/
@Contact : Crisimple@foxmail.com
@License : (C)Copyright 2017-2019, Micro-Circle
@Desc : 參數傳遞:字典、元組、字符串、文件
"""
import requests
# 2. 參數傳遞
# (1) 傳參參數為字典形式: 數據字典會在發送請求時會自動編碼為表單形式
def transfer_dict_parameter():
payload = {
'key1': 'value1',
'key2': 'value2'
}
transfer_dict_parameter_result = requests.post('https://httpbin.org/post', params=payload)
print("transfer_dict_parameter_url: ", transfer_dict_parameter_result.url)
print("transfer_dict_parameter_text: ", transfer_dict_parameter_result.text)
transfer_dict_parameter()
# (2) 傳參參數為元組形式: 應用於在表單中多個元素使用同一 key 的時候
def transfer_tuple_parameter():
payload = (
('key1', 'value1'),
('key1', 'value2')
)
transfer_tuple_parameter_result = requests.post('https://httpbin.org/post', params=payload)
print('transfer_tuple_parameter_url: ', transfer_tuple_parameter_result.url)
print('transfer_tuple_parameter_text: ', transfer_tuple_parameter_result.text)
transfer_tuple_parameter()
# (3) 傳參參數形式是字符串形式
def transfer_string_parameter():
payload = {
'string1': 'value'
}
transfer_string_parameter_result = requests.post('https://httpbin.org/post', params=payload)
print('transfer_string_parameter_url: ', transfer_string_parameter_result.url)
print('transfer_string_parameter_text: ', transfer_string_parameter_result.text)
transfer_string_parameter()
# (4) 傳參參數形式:一個多部分編碼(Multipart-Encoded)的文件
def transfer_multipart_encoded_file():
interface_url = 'https://httpbin.org/post'
files = {
# 顯示設置文件名、文件類型和請求頭
'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
}
transfer_multipart_encoded_file_result = requests.post(url=interface_url, files=files)
print('transfer_multipart_encoded_file_result_url: ', transfer_multipart_encoded_file_result.url)
print('transfer_multipart_encoded_file_result_url: ', transfer_multipart_encoded_file_result.text)
transfer_multipart_encoded_file()
2.3 接口響應
給接口傳遞參數,請求接口后,接口會給我們我們響應返回,接口在返回的時候,會給我們返回一個狀態碼來標識當前接口的狀態。
(1)狀態碼
【GitHub示例】
| 狀態碼 | 狀態 | 描述 |
---------- | ----- | ------
1xx | ---- |信息類的狀態碼 **
| 100 | Continue | 服務器僅接收到部分請求,但是一旦服務器並沒有拒絕該請求,客戶端應該繼續發送其余的請求。
| 101 | Switching Protocols | 服務器轉換協議,服務器將遵從客戶的請求轉換到另外一種協議
**2xx | ---- |*成功類的狀態碼 *
| 200 | OK | 請求成功(是對 GET 或 POST 的請求應答文檔)
| 201 | Created | 請求被創建完成,同時信的資源被創建
| 202 | Accepted | 供處理的請求已被接收,但是處理未完成
| 203 | Non-authoritative Information | 文檔已正常地返回,但一些應答頭可能不正確,以為使用的式文檔的拷貝
| 204 | No Content | 沒有新文檔。瀏覽器應該繼續顯示原來的文檔。如果用戶定期地刷新頁面,而Servlet可以確定用戶文檔足夠新,這個狀態代碼是很有用的。
| 205 | Reset Content | 沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
| 206 | Partial Content | 客戶發送了一個帶有Range頭的GET請求,服務器完成了它。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : response_code.py
@Time : 2019/9/2 15:41
@Author : Crisimple
@Github : https://crisimple.github.io/
@Contact : Crisimple@foxmail.com
@License : (C)Copyright 2017-2019, Micro-Circle
@Desc : None
"""
import requests
# 1. 返回接口狀態碼:200
def response_200_code():
interface_200_url = 'https://httpbin.org/status/200'
response_get = requests.get(interface_200_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)
response_200_code()
# 2.返回接口狀態碼:400
def response_400_code():
interface_400_url = 'https://httpbin.org/status/400'
response_get = requests.get(interface_400_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)
response_400_code()
(2)響應頭
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : response_content.py
@Time : 2019/9/2 15:41
@Author : Crisimple
@Github : https://crisimple.github.io/
@Contact : Crisimple@foxmail.com
@License : (C)Copyright 2017-2019, Micro-Circle
@Desc : None
"""
import requests
# 1. 返回接口狀態碼:
# (1). 返回接口狀態碼:200
def response_200_code():
interface_200_url = 'https://httpbin.org/status/200'
response_get = requests.get(interface_200_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)
response_200_code()
# (2).返回接口狀態碼:400
def response_400_code():
interface_400_url = 'https://httpbin.org/status/400'
response_get = requests.get(interface_400_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)
response_400_code()
# (3) 重定向接口返回狀態碼:301
def response_301_code():
interface_url = 'https://butian.360.cn'
response_get = requests.get(interface_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)
response_301_code()
# ------------------------------------------------------
# 2. 響應內容
  響應內容的請求頭、查看文本、編碼方式、二進制響應、原始響應。
def response_contents():
url = 'https://httpbin.org/get'
response_get = requests.get(url=url)
# 響應頭
print('response_get_headers', response_get.headers)
# 響應文本
print('response_get_text: ', response_get.text)
# 文本編碼方式
print('response_get_encoding: ', response_get.encoding)
# 二進制響應內容
print('response_get_content: ', response_get.content)
# 原始響應內容
origin_content = response_get.raw
origin_content_read = origin_content.read(10)
print('origin_content: ', origin_content)
print('origin_content_read: ', origin_content_read)
response_contents()
2.4 接口其他處理
【GitHub示例】
(1) 操作cookies
import requests
import time
url = 'https://httpbin.org/get'
def operator_cookies():
r = requests.get(url)
print('r.cookies: ', r.cookies)
jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
r2 = requests.get(url=url, cookies=jar)
print('r2.text', r2.text)
operator_cookies()
(2) 請求歷史
import requests
url = 'https://httpbin.org/get'
def request_history():
r = requests.get(url=url)
print('r.history: ', r.history)
request_history()
(3) 超時請求
requests 在經過 timeout 參數設定的秒數時間之后停止等待響應。
import requests
import time
def timeout():
print(time.time())
url = 'https://httpbin.org/get'
print(time.time())
r = requests.get(url, timeout=5)
print(time.time())
timeout()
(4) 錯誤與異常
常見的錯誤異常有:
· 遇到網絡問題(如:DNS 查詢失敗、拒絕連接等時),requests 會拋出一個 ConnectionError 異常。
· 如果 HTTP 請求返回了不成功的狀態碼, Response.raise_for_status() 會拋出一個 HTTPError異常。
· 若請求超時,則超出一個 Timeout 異常。
· 若請求超過了設定的最大重定向次數,則會拋出一個 TooManyRedirects 異常。
· 所有 Requests 顯式拋出的異常都繼承自 requests.exceptions.RequestsException。