前言
现在越来越多的公司都需要自动化的测试人员,那么我们将从以下几个点来讲述一下,作为一个测试人员,该如何学习和了解HTTP请求返回数据:
1)requests环境安装
2)如何发送HTTP请求
3)如何获取接口响应内容
4)获取接口响应状态码
5)获取响应头信息
6)如何处理接口响应异常
7)如何处理接口中的Cookie和Session
8)接口中的重定向处理
9)请求接口时设置超时时间
requests环境安装
用python自带的pip命令进行 requests
依赖包的安装(推荐使用镜像源):
pip install requests -i https://mirrors.aliyun.com/pypi/simple/
安装成功后,可以通过命令进行查看:
pip show requests
查看效果:
如何发送HTTP请求
在目前的工作中,主流的就是两种请求方式 get
和 post
,那么我们来看看该如何用 python 语言中的 requests
库对HTTP进行接口请求。
1)发送 GET 请求
GET 请求是接口测试中最常见的一种请求方式。在许多情况下,通过简单的浏览器访问即可获取数据,但是使用 Python 脚本发送 GET 请求使得我们可以更灵活地处理响应数据,方便自动化测试、数据采集等应用场景。
a. 简单的 get 请求示例:
import requests # 接口请求地址 url = "http://localhost:8080/hello_get" res = requests.get(url=url)
b. 携带参数的 get 请求示例:
import requests # 接口请求地址 url = "http://localhost:8080/admin/hello_get" params = { 'id': '1' } res = requests.get(url=url, params=params)
2)发送 POST 请求
在接口测试和数据交互中,POST 请求通常用于向服务器提交数据。通过 Python 中的 requests
库,我们可以方便地发送 POST 请求,并处理响应结果。
a. 简单的 post 请求示例(请求的时候,选择类型为 data
):
import requests url = "http://localhost:8080/admin/login" data = {'name': 'John', 'age': 25, 'city': 'New York'} response = requests.post(url, data=data)
b. 发送 JSON 数据的 post 请求(请求的时候,选择类型为 json
):
import requests url = "http://localhost:8080/admin/login" data = {'name': 'John', 'age': 25, 'city': 'New York'} response = requests.post(url, json=data)
如何获取接口响应内容
a. 普通的接口响应内容获取:
content = response.text print(content)
b. json格式的接口响应内容获取(需要通过 json()
方法解析返回的内容对象):
json_content = response.json() print(json_content)
获取接口响应状态码
HTTP响应的状态码可以通过response.status_code
属性获取。状态码是服务器对请求的处理结果的数字标识。
status_code = response.status_code print(f"响应的状态码: {status_code}")
HTTP接口的常见状态码解析:
-
1xx(信息性状态码):
-
100 Continue: 表示服务器已经收到了请求的第一部分,正在等待客户端继续发送其余的请求。
-
101 Switching Protocols: 表示服务器已经理解了客户端的请求,并将通过 Upgrade 消息头通知客户端采用不同的协议。
-
-
2xx(成功状态码):
-
200 OK: 请求成功。服务器成功地处理了请求。
-
201 Created: 请求被成功地创建了新的资源。
-
204 No Content: 服务器成功处理请求,但没有返回任何内容。
-
-
3xx(重定向状态码):
-
301 Moved Permanently: 请求的资源已经永久移动到新的位置。
-
302 Found: 请求的资源暂时移动到新的位置。
-
304 Not Modified: 资源未被修改,可以使用缓存的版本。
-
-
4xx(客户端错误状态码):
-
400 Bad Request: 服务器无法理解客户端的请求,通常由于客户端发送的请求中有语法错误。
-
401 Unauthorized: 请求要求身份验证。要求客户端进行身份验证。
-
403 Forbidden: 服务器已经理解请求,但拒绝执行它。
-
-
5xx(服务器错误状态码):
-
500 Internal Server Error: 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
-
502 Bad Gateway: 服务器作为网关或代理,从上游服务器收到无效的响应。
-
503 Service Unavailable: 服务器当前无法处理请求,通常由于过载或维护。
-
获取响应头信息
HTTP响应头包含了一系列关于响应的元信息,如服务器类型、数据类型等。可以通过response.headers
属性获取响应头的字典。
headers = response.headers print(headers)
如何处理接口响应异常
在实际应用中,我们需要考虑到一些异常情况,比如网络不可达、服务器错误等。可以使用response.raise_for_status()
来检查是否有HTTP错误发生。
try: response.raise_for_status() # 用于检查HTTP响应的状态码。如果状态码表明请求不成功,该方法会引发HTTP Error异常 except requests.exceptions.HTTPError as errh: # 捕获HTTPError异常,如果发生了这种异常,就执行接下来的代码块 print ("HTTP Error:",errh) except requests.exceptions.ConnectionError as errc: # 捕获ConnectionError异常,处理连接错误的情况 print ("Error Connecting:",errc) except requests.exceptions.Timeout as errt: # 捕获Timeout异常,处理超时错误的情况 print ("Timeout Error:",errt) except requests.exceptions.RequestException as err: # 捕获RequestException异常,可以捕获上述以外的其他异常情况 print ("Oops, Something went wrong:",err)
如何处理接口中的Cookie和Session
Cookie:
定义: Cookie是存储在用户计算机上的小型文本文件,由服务器在每个HTTP请求中发送到客户端,并由浏览器存储。它包含了有关用户的信息,用于跟踪用户的状态。
工作原理: 当用户访问一个网站时,服务器会在响应头中设置一个Set-Cookie头,其中包含了Cookie的信息。浏览器会将这个Cookie保存在用户的本地计算机上。在后续的请求中,浏览器会将相应的Cookie信息自动包含在请求头中,发送给服务器。
特点:
-
存储在客户端,可以由浏览器禁用或删除。
-
大小通常受到限制。
-
可以设置过期时间。
Session:
定义: Session是在服务器端保存的用户信息,通常以键值对的形式存储。每个用户都有一个唯一的会话标识,通过Cookie或URL参数将这个标识传递给客户端。
工作原理: 当用户访问一个需要用户身份验证的页面时,服务器会创建一个唯一的会话标识,并将其发送给客户端(通常通过Cookie)。在后续的请求中,客户端会将这个会话标识带回服务器,服务器通过这个标识来获取或更新用户的会话信息。
特点:
-
存储在服务器端,客户端只保存了会话标识。
-
通常不受大小限制。
-
会话信息在服务器上存储,可以包含更多的用户信息。
区别和关系:
-
位置不同: Cookie存储在客户端,而Session存储在服务器端。
-
内容不同: Cookie通常包含少量的用户信息,而Session可以包含更多、更敏感的用户信息。
-
大小限制: Cookie有大小限制,而Session通常不受限制。
-
安全性: 由于Session数据存储在服务器上,相对较安全。Cookie可能会被用户篡改,因此存储在Cookie中的信息应谨慎选择。
1)获取Cookie值
通过response.cookies
属性可以获取响应中的Cookie信息。
import requests # 发送HTTP请求 response = requests.get('http://localhost:8080/admin/login') # 获取响应中的Cookie信息 cookies = response.cookies print(cookies)
2)使用Cookie进行后续请求
使用Session
对象,可以在多个请求之间保持Cookie,以维持会话状态。
import requests # 创建一个新的会话 session = requests.Session() # 将之前获取的Cookie添加到会话中 session.cookies.update(cookies) # 发送带有Cookie的新请求 new_response = session.get('http://localhost:8080/admin/homepage')
3)获取Session值
Session
对象会在多个请求之间保持一些参数,比如Cookie。
import requests # 创建一个Session对象 session = requests.Session()
4)发送带有Session的请求
使用Session
对象发送请求,该对象将在多个请求之间保持一些信息,比如Cookie,以保持会话状态。
import requests # 使用Session对象发送GET请求 response = session.get('http://localhost:8080/admin/homepage1')
5)处理响应和Cookie
此时,response.cookies
中包含了响应中的所有Cookie信息。
import requests # 处理响应 print(response.text) # 获取响应中的Cookie信息 cookies = response.cookies
6)在后续请求中使用Session
Session
对象将在后续请求中继续保持之前的状态,包括Cookie等信息。
import requests # 在后续请求中继续使用同一个Session对象 new_response = session.get('https://localhost:8080/new_page')
7)关闭Session
import requests # 关闭Session,释放资源 session.close()
如果希望自动关闭Session
对象,可以使用with
语句:
with requests.Session() as session: response = session.get('https://example.com')
接口中的重定向处理
在接口中,重定向处理是指当服务器收到请求后,不直接返回数据,而是返回一个指示客户端应该向另一个位置重新发起请求的响应。重定向用于将客户端引导到新的UR,比如登录、认证、或者资源的迁移。
常见的重定向状态码有:
-
301 Moved Permanently: 表示所请求的资源已被分配了新的永久 URI。客户端应该使用新的 URI 重新发起请求。
-
302 Found: 表示所请求的资源已被暂时的移动到了新的 URI。客户端应该使用新的 URI 重新发起请求,但不要更新书签,因为将来可能还会发生变化。
-
303 See Other: 表示所请求的资源已经被另一个 URI 处理,但是客户端应该向新的 URI 发送一个 GET 请求。
-
307 Temporary Redirect: 类似于 302 Found,但要求客户端使用相同的请求方法重新发起请求。
在处理重定向时,客户端通常需要遵循新的URL重新发起请求,然后根据新的响应进行进一步处理。
1)允许或禁止重定向
默认情况下,allow_redirects
为True
,即允许重定向。如果将其设置为False
,则请求将不会自动处理重定向,而是返回包含重定向信息的响应对象。
# 允许重定向(默认情况) response = requests.get(url) # 禁止重定向 response_no_redirect = requests.get(url, allow_redirects=False)
2)处理重定向响应
在允许重定向的情况下,response.url
会包含重定向后的最终URL,而在禁止重定向的情况下,response_no_redirect.url
会包含发生重定向前的URL。
# 查看重定向前的URL original_url = response.url print(f"Original URL: {original_url}") # 查看重定向后的URL redirected_url = response_no_redirect.url print(f"Redirected URL: {redirected_url}") # 查看重定向的状态码 status_code = response.status_code print(f"重定向的状态码: {status_code}")
3)手动处理重定向
在禁止自动重定向的情况下,可以通过检查响应的状态码和查找Location
头部来手动处理重定向。
# 手动处理重定向 if response.status_code == 302: # 获取重定向的URL redirect_url = response.headers['Location'] # 发起新请求 new_response = requests.get(redirect_url)
4)处理历史重定向信息
如果允许重定向,response.history
将包含一个重定向历史列表,每个元素都是一个包含重定向前信息的响应对象。可以遍历这个列表以查看重定向的历史信息。
# 查看重定向历史 redirect_history = response.history for redirect in redirect_history: print(f"Redirected to: {redirect.url}")
请求接口时设置超时时间
在进行HTTP请求时,设置超时时间是一种有效的方式,可以防止请求因为网络延迟或其他原因而导致程序长时间等待。
1)设置超时时间
timeout=5
表示请求的最大超时时间为5秒。如果在这个时间内没有得到响应,将引发一个Timeout
异常,可以在异常处理中采取适当的措施,例如重试请求或记录日志。
# 设置请求超时时间为5秒 response = requests.get(url, timeout=5)
2)指定超时时间的单位
还可以指定一个元组,其中第一个元素表示连接超时,第二个元素表示读取超时。
# 设置不同的超时时间,比如2秒连接超时和5秒读取超时 response = requests.get(url, timeout=(2, 5))
3)处理超时异常
在发生超时异常时,可以在except requests.exceptions.Timeout
块中处理它。这能够更好地应对网络请求超时的情况。
try: response = requests.get(url, timeout=5) # 使用requests.get方法发送HTTP GET请求,并设置了超时时间为5秒 response.raise_for_status() # 检查响应的HTTP状态码,如果状态码表明请求不成功,将引发HTTPError异常 except requests.exceptions.Timeout as errt: # 在规定的时间内未完成(超时),则会捕获requests.exceptions.Timeout异常 print(f"Timeout Error: {errt}") # 可以执行一些处理超时的操作,例如记录日志、重试请求或提供用户友好的错误提示 except requests.exceptions.RequestException as err: # 用于捕获requests库中的所有其他异常 print(f"Oops, Something went wrong: {err}") # 可以处理其他类型的异常,例如连接错误等。打印错误信息是其中一种简单的处理方式
4)全局默认超时时间
还可以在代码的其他地方设置全局默认的超时时间,这样所有的请求都会使用相同的超时时间,除非在请求中显式指定了超时时间。
# 设置全局默认超时时间 requests.DEFAULT_TIMEOUT = 5
结语
那么到这里我们就清楚的知道HTTP请求的一些详细内容,以及如何通过 python 中的 requests 对接口进行请求和相关的处理了,那么我们下次再见👋🏻